博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Kotlin怎样使用Android的Dagger2
阅读量:5173 次
发布时间:2019-06-13

本文共 2670 字,大约阅读时间需要 8 分钟。

作者:

时间:Apr 11, 2017

原文链接:https://antonioleiva.com/dagger-android-kotlin/

 

 

Android上,创建去耦以及容易测试代码的几乎每位迟早都要诉诸Dagger

 

虽然,在Kotlin中设置Dagger有一些不同,但是大多数都十分简单,仅需要几个步骤。今天我就在这里讲解。

 

同时要意识到,由于Kotlin的能力,还有其他方法可以解决注入问题,甚至在Kotlin中还有一些专门的库来解决。

 

但是Dagger仍然是有效的选择,即使不是最最通用的,也是其中之一。

 

 

提示:

 

在这篇文章中,我不会解释怎样使用Dagger 2,这是已知的。如果你有任何问题,可以阅读我之前写过

 

Dagger 2配置项目

 

如果在你的项目中,你已经配置了Kotlin插件,你需要做的就是配置kapt

 

如果你已经使用过Dagger,你大概知道apt.kaptKotlin的一个版本,它为Dagger创建了需要的自生成类。

 

为了配置它,你需要将下面内容加入build.gradle

1 kapt {2     generateStubs = true3 }

 

你能够将其加入在依赖节之前。如果愿意,你能够使用新的实验性插件,它已经相当稳定了:

 

1 apply plugin: 'kotlin-kapt'

 

 

现在,你就需要加入Dagger编译器的依赖关系(是使用kapt而不是包括在apk中)和实际的库:

1 kapt 'com.google.dagger:dagger-compiler:2.5'2 compile 'com.google.dagger:dagger:2.5'

 

这样一切就绪,可以开始使用Dagger

 

主模块的实现

 

 

你可能知道,对于主图形,你需要一个Module和一个Component

 

在这个简单的例子中,应用模块仅返回应用自己的实例。

 

 

为了这样做,我们将用@Module注解创建一个类,通过构造函数接收应用实例,将其保存到属性中,用@Provides@Singleton注解的方法返回它。

1 @Module class AppModule(val app: App) {2     @Provides @Singleton fun provideApp() = app3 }

 

你可以看到,即使对于这样简单的类,其代码也要比用Java简单得多。

 

接着我们要实现Component,它需要加载一个模块数组,并且说明谁能够手动注入它:

1 @Singleton2 @Component(modules = arrayOf(AppModule::class))3 interface AppComponent {4     fun inject(app: App)5 }

 

再就只创建一个App类,它将负责生成图片:

1 class App : Application() { 2  3     val component: AppComponent by lazy { 4         DaggerAppComponent 5                 .builder() 6                 .appModule(AppModule(this)) 7                 .build() 8     } 9 10     override fun onCreate() {11         super.onCreate()12         component.inject(this)13     }14 }

 

这里看到的有趣的事是,由于lazy声明,我们能够在属性的定义中指定图形的值,因此就获得了对该属性的只读访问权。

 

 

component.inject (this)完成前,代码定义的属性不会被执行,所以到那时,this已经存在了,就可以安全地创建了。

 

每个模块实现的范围

 

 

模块的范围仅允许图部分在其它的对象生命周期中生存。

 

 

用这种方法,例如,我们可以

 

 

 

我们会用依据需要创自己的建模块:

 

1 @Module2 class HomeModule(val activity: HomeActivity) {3 }

 

 

Subcomponent非常类似前面所述方法,表明它会注入HomeActivity:

 

1 @Singleton2 @Subcomponent(modules = arrayOf(HomeModule::class))3 interface HomeComponent {4     fun inject(activity: HomeActivity)5 }

 

 

AppComponentplus方法,表示这个组件能够加入到子组件的类型:

1 interface AppComponent {2     ...3     fun plus(homeModule: HomeModule): HomeComponent4 }

 

现在,你就只需要在HomeActivity中声明子组件:

1 val component by lazy { app.component.plus(HomeModule(this)) }

 

你可在setContentView之后注入它:

1 override fun onCreate(savedInstanceState: Bundle?) {2     super.onCreate(savedInstanceState)3     setContentView(R.layout.activity_main)4     component.inject(this)5 }

 

如果你想知道app是从哪里来的,它是一个像这样扩展属性:

1 val Activity.app: App2     get() = application as App

 

如果您有自己的自定义application,这只是一种避免每次访问的简单方法。

 

结论

 

Kotlin中,使用Dagger 2也很容易。你再无有理由在Kotlin中去实现一个很大的解耦架构了。

 

如果你要学习更多的这些并且用Kotlin创建自己的Android APP,就看看,学习怎样建立你的第一个项目,或是直接,学习怎样从头开始创建一个完整的APP

 

转载于:https://www.cnblogs.com/figozhg/p/6718654.html

你可能感兴趣的文章
Beta总结
查看>>
Spring.NET学习笔记
查看>>
python基础小练习
查看>>
Spring杂记BeanFactory之getBean方法
查看>>
linux 下 tcpdump 命令详解
查看>>
在阿里云搭建属于自己的个人空间--让全世界找到我
查看>>
每日编程-20170315
查看>>
K-MEANS算法
查看>>
翻译:Hilo:第一章 介绍 Hilo
查看>>
OpenCV-自适应阈值化
查看>>
BestCoder-Round#33
查看>>
Codeforces Round #527 (Div. 3) D1. Great Vova Wall (Version 1)
查看>>
集合,ArrayList练习
查看>>
宋体汉字字号和点阵大小对应关系
查看>>
动力学公式…
查看>>
[BZOJ1500][NOI2005]维修数列
查看>>
[OJ#15]TR #2 画心
查看>>
吴恩达机器学习笔记 —— 13 支持向量机
查看>>
k-means算法的优缺点以及改进
查看>>
Spring-Boot + MyBatis-Plus 踩坑记录
查看>>