陆陆续续几篇文章已经讲解了项目中 Kotlin 如何配置、简单语法、DataBinding 配置,接下来就要说到 Kotlin 中的 Dagger2 了。
配置 Dagger2
项目中使用 Dagger2 ,首先还是添加依赖。同样的,因为要使用到注解处理,所以和 DataBinding 一样要添加 kapt 插件:
apply plugin: 'com.android.application' ... apply plugin: 'kotlin-kapt' // kapt 插件 ... kapt { generateStubs = true } dependencies { ... implementation 'com.google.dagger:dagger:2.12' // Dagger 2 依赖 implementation 'com.google.dagger:dagger-android-support:2.12' // Dagger 2 Android 支持包 kapt 'com.google.dagger:dagger-compiler:2.12' // Dagger 2 注解处理 }
配置很简单,就这样完成了。
使用 Dagger2
简单的配置完 Dagger2 ,接下来就是如何在 Android 项目中使用了。参见官方说明
首先使 Application 继承 DaggerApplication,Activity 继承 DaggerAppCompatActivity,Fragment 继承 DaggerFragment。
新建一个接口使用 @Subcomponent 注解继承
AndroidInjector
@Subcomponent(modules = arrayOf(...)) // 没有其他 Module 圆括号可省略 interface YourActivitySub : AndroidInjector{ @Subcomponent.Builder abstract class Builder : AndroidInjector.Builder () }
新建一个抽象类使用 @Module 注解,用于出入 Activity。
@Module(subcomponents = arrayOf( YourActivitySub::class)) // 每新建一个 Activity,都要新建相应的 ActivitySub 接口,并添加到这里 abstract class ActivityModule { @Binds // 每新建一个 Activity,都要添加一个相应方法,方法名不能相同 @IntoMap @ActivityKey(YourActivity::class) abstract fun bindYourActivity(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等所有类型可用 interface ApplicationSub : AndroidInjector{ @Component.Builder abstract class Builder : AndroidInjector.Builder () }
使你的 Applicatoin 类继承 DaggerApplication。
class MyApplication : DaggerApplication() { // 如果项目中使用了 v4.Fragment 要继承 support 包下的 DaggerApplication override fun applicationInjector() : AndroidInjector{ return DaggerApplicationSub.builder().create(this) // 编译后生成 } }
优化
这样使用是不是很麻烦?在 Dagger2 2.11 版本之前,项目中每添加一个 Activity 或 Fragment 等组件,都要新建一个对应 Subcomponent 接口,并添加到对应的 Module 中,并且添加相应的方法。这样使用起来太复杂了。
好在 google 也同样的意识到了这个问题,所以在 Dagger2 2.11 版本及其以后,Dagger2 又为我们提供了一个 @ContributesAndroidInjector 注解,大大的简化了使用。
首先,使用这个注解,你需要添加上 Dagger2 注解处理的 Android 支持:
dependencies { ... implementation 'com.google.dagger:dagger:2.12' // Dagger 2 支持 implementation 'com.google.dagger:dagger-android-support:2.12' // Dagger 2 Android 支持 kapt 'com.google.dagger:dagger-compiler:2.12' // Dagger 2 注解处理 kapt 'com.google.dagger:dagger-android-processor:2.12' // Dagger 2 注解处理 Android 支持 ... }
然后,在注入 Activity 的 Module 中改变:
@Module // 不需要再为每个 Activity 新建对应的 Subcomponent,不必再添加到这里 abstract class ActivityModule { @ContributesAndroidInjector abstract fun contributeYourActivity() : YourActivity }
就这样,是不是简洁了很多?之后每添加一个 Activity,只需要在 Activity 添加一个对应的方法就可以了。
@ContributesAndroidInjector 注解自动生成对应的 Subcomponent 而不需要我们手动添加。
语法解析
Dagger 2 的配置使用说完了,但是相信很多人对上面的一些语法都不了解,这里来简单说明:
// Kotlin 提供的方法,能简单快速的生成一个数组 val array = arrayOf("1", "2") // 与之类似的还有 arrayListOf() 、 setOf() 等,以后详细说明 // 类对象 A::class // 相当于 Java 中的 A.class,同时还有 A.javaClass 相当于 Java 中的 A.getClass()
最后
今天的 Kotlin Dagger2 使用就讲到这里,接下来我还会为大家带来更多的 Kotlin 相关语法知识以及基类封装等。热血大作战 安卓最新版v2.1.166
下载凡尔赛法环免广告版 最新版v1.69.1
下载天煞异种 安卓版v1.0.21
下载十三月 (Undecember)最新官方中文版v3.26.0200
下载星露谷物语sve 安卓版v1.5.6.52
星露谷物语sve手机版是游戏的超大拓展Mod内容,全称Sta
动物园大亨 手机版v2.0
动物园大亨是一款模拟动物园经营的休闲放置游戏,采用了卡通画风
蜜蜂园林钞票不减反增版 v0.1.68
蜜蜂园林无限道具版是游戏的破解版本,在该版本中为玩家提供了足
幻想熔炉失落帝国的世界 安卓版v2.16.2
幻想熔炉失落帝国的世界是一款魔法卡通风格的城市模拟经营类游戏
我的女友是声优免广告 安卓版v1
我的女友是声优免广告是一款非常好玩的模拟经营类手游,玩家在游