Kotlinはダガー2を使用しています

2904 ワード

環境設定
  //gradle   
  apply plugin: 'kotlin-dapt'
  //           
  compile "com.google.dagger:dagger:2.14.1"
  kapt "com.google.dagger:dagger-compiler:2.14.1"
@Inject構造方法注入
  • 注釈表示構造方法を用いる
    class MainPresenter @Inject constructor() {
        fun doSomething():String{
            return "This is result"
        }
    }
    
  • 注釈表示変数を使用する
     @Inject
     lateinit var mPresenter:MainPresenter
    
  • Componentを使用して連絡を作成する
    @Component
    interface MainComponent {
        fun inject(activity:MainActivity)
    }
    
  • コンパイルして、コンパイルして、Daggarの先頭のComponentファイル
  • を自動的に生成します.
  • 注入登録
    class MainActivity: AppCompatActivity() {
        @Inject 
        lateinit var mPresenter:MainPresenter
        
        override fun onCreate(savedInstanceState: Bundle?) { 
            super.onCreate(savedInstanceState) 
            setContentView(R.layout.activity_main) 
            //    
            initInjection() 
            mClickBtn.setOnClickListener { 
                toast(mPresenter.doSomething()) 
            } 
        } 
        /* Dagger2     */ 
        private fun initInjection() { 
            DaggerMainComponent.builder().build().inject(this) 
        }
    }
    
  • @Module工場注入
  • 1.必要なインスタンスを作成するクラス
    interface MainService {
      fun getMainInfo():String    
    }
    
    class MainServiceImpl:MainService {
        override fun getMainInfo():String {
            return "This is main info"
        }
    }
    
    // MainActivity   
    @Inject
    lateinit var mMainService:MainService
    
  • .例の化学工場及び方法
    @Module
    class MainModule {
        @Provides
        fun provideMainService():MainService {
            return MainServiceImpl()
        }
    }
    
  • を作成する.
  • .ComponentとModule関連
    @Component(modules = [(MainModule::class)])
    interface MainComponent {
        fun inject(activity:MainActivity)
    }
    
  • .コンパイルDaggar先頭の対応するファイル
  • を自動的に生成する.
  • .登録
    class MainActivity: AppCompatActivity() {
        @Inject
      lateinit var mMainService:MainService
        
        override fun onCreate(savedInstanceState: Bundle?) { 
            super.onCreate(savedInstanceState) 
            setContentView(R.layout.activity_main) 
            //    
            initInjection() 
            mClickBtn.setOnClickListener { 
                toast(mMainService.getMainInfo()) 
            } 
        } 
        /* Dagger2      */ 
        private fun initInjection() { 
            DaggerMainComponent.builder().mainModule(MainModule()).build().inject(this) 
        }
    }
    
  • 再帰的注入(構造方法と工場との結合)
  • MainServiceImpl構造方法を@Inject表記
    class MainServiceImpl @Inject constructor():MainService {
        override fun getMainInfo():String {
            return "This is main info"
        }
    }
    
  • を使用する.
  • 工場方法は、
      @Provides
        fun provideMainService(service:MainServiceImpl):MainService {
            return service
        }
    
  • に変更されました.