详解Kotlin 中使用和配置 Dagger2
前言
陆陆续续几篇文章已经讲解了项目中Kotlin如何配置、简单语法、DataBinding配置,接下来就要说到Kotlin中的Dagger2了。
配置Dagger2
项目中使用Dagger2,首先还是添加依赖。同样的,因为要使用到注解处理,所以和DataBinding一样要添加kapt插件:
applyplugin:'com.android.application' ... applyplugin:'kotlin-kapt'//kapt插件 ... kapt{ generateStubs=true } dependencies{ ... implementation'com.google.dagger:dagger:2.12'//Dagger2依赖 implementation'com.google.dagger:dagger-android-support:2.12'//Dagger2Android支持包 kapt'com.google.dagger:dagger-compiler:2.12'//Dagger2注解处理 }
配置很简单,就这样完成了。
使用Dagger2
简单的配置完Dagger2,接下来就是如何在Android项目中使用了。参见官方说明
首先使Application继承DaggerApplication,Activity继承DaggerAppCompatActivity,Fragment继承DaggerFragment。
新建一个接口使用@Subcomponent注解继承AndroidInjector
@Subcomponent(modules=arrayOf(...))//没有其他Module圆括号可省略 interfaceYourActivitySub:AndroidInjector{ @Subcomponent.Builder abstractclassBuilder:AndroidInjector.Builder () }
新建一个抽象类使用@Module注解,用于出入Activity。
@Module(subcomponents=arrayOf(YourActivitySub::class)) //每新建一个Activity,都要新建相应的ActivitySub接口,并添加到这里 abstractclassActivityModule{ @Binds//每新建一个Activity,都要添加一个相应方法,方法名不能相同 @IntoMap @ActivityKey(YourActivity::class) abstractfunbindYourActivity(builder:YourActivitySub.Builder):AndroidInjector.Factory}
新建接口YouApplicationSub使用@Component注解,继承AndroidInjector
@Singleton//如果有Module使用了该注解实现单例模式,这里也需要添加 @Component(modules=arrayOf( ActivityModule::class,//注入Activity的Module FragmentModule::class,//注入Fragment的Module ... AndroidSupportInjectionModule::class))//确保DaggerApplication、DaggerActivity、DaggerFragment等所有类型可用 interfaceApplicationSub:AndroidInjector{ @Component.Builder abstractclassBuilder:AndroidInjector.Builder () }
使你的Applicatoin类继承DaggerApplication。
classMyApplication:DaggerApplication(){//如果项目中使用了v4.Fragment要继承support包下的DaggerApplication overridefunapplicationInjector():AndroidInjector{ returnDaggerApplicationSub.builder().create(this)//编译后生成 } }
优化
这样使用是不是很麻烦?在Dagger22.11版本之前,项目中每添加一个Activity或Fragment等组件,都要新建一个对应Subcomponent接口,并添加到对应的Module中,并且添加相应的方法。这样使用起来太复杂了。
好在google也同样的意识到了这个问题,所以在Dagger22.11版本及其以后,Dagger2又为我们提供了一个@ContributesAndroidInjector注解,大大的简化了使用。
首先,使用这个注解,你需要添加上Dagger2注解处理的Android支持:
dependencies{ ... implementation'com.google.dagger:dagger:2.12'//Dagger2支持 implementation'com.google.dagger:dagger-android-support:2.12'//Dagger2Android支持 kapt'com.google.dagger:dagger-compiler:2.12'//Dagger2注解处理 kapt'com.google.dagger:dagger-android-processor:2.12'//Dagger2注解处理Android支持 ... }
然后,在注入Activity的Module中改变:
@Module//不需要再为每个Activity新建对应的Subcomponent,不必再添加到这里 abstractclassActivityModule{ @ContributesAndroidInjector abstractfuncontributeYourActivity():YourActivity }
就这样,是不是简洁了很多?之后每添加一个Activity,只需要在Activity添加一个对应的方法就可以了。
@ContributesAndroidInjector注解自动生成对应的Subcomponent而不需要我们手动添加。
语法解析
Dagger2的配置使用说完了,但是相信很多人对上面的一些语法都不了解,这里来简单说明:
//Kotlin提供的方法,能简单快速的生成一个数组 valarray=arrayOf("1","2")//与之类似的还有arrayListOf()、setOf()等,以后详细说明 //类对象 A::class//相当于Java中的A.class,同时还有A.javaClass相当于Java中的A.getClass()
最后
今天的KotlinDagger2使用就讲到这里,接下来我还会为大家带来更多的Kotlin相关语法知识以及基类封装等。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。