Kotlin使用dagger2

作者: kermitye | 来源:发表于2018-08-29 15:07 被阅读70次

    环境配置

      //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)
      }
      
    • 编译, 编译,编译之后会自动生成相应Dagger开头的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
      
    • 2.创建实例化工厂及方法

      @Module
      class MainModule {
          @Provides
          fun provideMainService():MainService {
              return MainServiceImpl()
          }
      }
      
    • 3.Component与Module关联

      @Component(modules = [(MainModule::class)])
      interface MainComponent {
          fun inject(activity:MainActivity)
      }
      
    • 4.编译 编译 编译 自动生成Dagger开头的相应文件

    • 5.注册

      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
          }
      

    相关文章

      网友评论

      • 446b036272e7:我根据你这个并没把dagger2配置成功

        apply plugin: 'com.android.application'
        apply plugin: 'kotlin-android'
        apply plugin: 'kotlin-android-extensions'
        apply plugin: 'kotlin-kapt'
        kapt {
        generateStubs = true
        }

        implementation 'com.google.dagger:dagger-android:2.17'
        implementation 'com.google.dagger:dagger-android-support:2.17'
        annotationProcessor 'com.google.dagger:dagger-android-processor:2.17'
        annotationProcessor 'com.google.dagger:dagger-compiler:2.17'

        我的配置对不对?还有哪些细节吗?我用java写是可以出来的
        446b036272e7:就是没有生成响应的类

        @Component(modules = [MainModule::class])
        interface MainComponent {
        fun inject(activity: MainActivity)
        }

        class MainPresenter @Inject constructor() {
        fun doSome() : String {
        return "hello"
        }
        }

        @Module
        class MainModule {

        @Provides fun getPresenter():MainPresenter {
        return MainPresenter()
        }
        }

      本文标题:Kotlin使用dagger2

      本文链接:https://www.haomeiwen.com/subject/vhfkwftx.html