作者:Antonio Leiva

时间:Apr 11, 2017

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

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

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

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

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

提示:

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

用Dagger 2配置项目

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

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

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

 kapt {
generateStubs = true
}

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

 apply plugin: 'kotlin-kapt'

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

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

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

主模块的实现

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

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

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

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

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

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

 @Singleton
@Component(modules = arrayOf(AppModule::class))
interface AppComponent {
fun inject(app: App)
}

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

 class App : Application() {

     val component: AppComponent by lazy {
DaggerAppComponent
.builder()
.appModule(AppModule(this))
.build()
} override fun onCreate() {
super.onCreate()
component.inject(this)
}
}

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

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

每个模块实现的范围

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

用这种方法,例如,我们可以在Activity的生存中创建子图

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

 @Module
class HomeModule(val activity: HomeActivity) {
}

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

 @Singleton
@Subcomponent(modules = arrayOf(HomeModule::class))
interface HomeComponent {
fun inject(activity: HomeActivity)
}

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

 interface AppComponent {
...
fun plus(homeModule: HomeModule): HomeComponent
}

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

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

你可在setContentView之后注入它:

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

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

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

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

结论

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

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

Kotlin怎样使用Android的Dagger2的更多相关文章

  1. [Android]使用Kotlin+Anko开发Android(一)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4800656.html  Kotlin是由JetBrains开发 ...

  2. Kotlin 语言作为Android新的官方语言

    苹果用 swift 作为官方语言替代 object-c  ; 谷歌 刚开完io大会 也宣布 用  kotlin 作为官方语言 替代java.工具还是xcode ,android studio. 来自于 ...

  3. Android——初探Dagger2依赖注入

    1,在做项目时,经常需要在一个对象里去创建另一个对象的示例,这种行为是产生耦合的常见形式,对于一个大型项目来说,过多的相互依赖会导致代码难以维护,很容易就会碰到修改一个小需求需要大面积的修改各种代码, ...

  4. Android 使用dagger2进行依赖注入(基础篇)

    0. 前言 Dagger2是首个使用生成代码实现完整依赖注入的框架,极大减少了使用者的编码负担,本文主要介绍如何使用dagger2进行依赖注入.如果你不还不了解依赖注入,请看这一篇. 1. 简单的依赖 ...

  5. Kotlin入门(19)Android的基础布局

    线性布局线性布局LinearLayout是最常用的布局,顾名思义,它下面的子视图像是用一根线串了起来,所以其内部视图的排列是有顺序的,要么从上到下垂直排列,要么从左到右水平排列.排列顺序只能指定一维方 ...

  6. 认识一下Kotlin语言,Android平台的Swift

    今天在CSDN首页偶然看到一个贴子JetBrains正式公布Kotlin 1.0:JVM和Android上更好用的语言 看完后,感觉Kotlin语法非常简洁,有一系列动态语言的特点,Lambda表达式 ...

  7. Kotlin Coroutines在Android中的实践

    Coroutines在Android中的实践 前面两篇文章讲了协程的基础知识和协程的通信. 见: Kotlin Coroutines不复杂, 我来帮你理一理 Kotlin协程通信机制: Channel ...

  8. kotlin 第一个Android项目

    一.创建过程 二.TextView点击事件 class MainActivity : AppCompatActivity() { lateinit var tv:TextView; //初始化Text ...

  9. Android的Kotlin秘方(I):OnGlobalLayoutListener

    春节后,又重新“开张”.各位高手请继续支持.谢谢! 原文标题:Kotlin recipes for Android (I): OnGlobalLayoutListener 原文链接:http://an ...

随机推荐

  1. ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(六)之 好友申请、同意、拒绝

    不知道距离上一篇多久没有写了,可能是因为忙(lan)的关系吧.废话不多说,今天要介绍的不算什么新知识,主要是逻辑上的一些东西.什么逻辑呢,加好友,发送好友申请,对方审批通过,拒绝.(很遗憾,对方审批通 ...

  2. oracle 基础知识(四)常用函数

    SQL中的单记录函数 .ASCII 返回与指定的字符对应的十进制数; SQL') zero,ascii(' ') space from dual; A A ZERO SPACE --------- - ...

  3. HDU 1312 Red and Black(最简单也是最经典的搜索)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1312 Red and Black Time Limit: 2000/1000 MS (Java/Oth ...

  4. Mac通过域名查询IP地址

    Mac通过域名查询IP地址 方法一:使用Mac自带的"网络实用工具" 步骤: 搜索"网络使用工具",并打开: 点击LookUp,输入互联网地址,点击Lookup ...

  5. ABAP术语-Business Process

    Business Process 原文:http://www.cnblogs.com/qiangsheng/archive/2008/01/11/1035316.html A prepared sce ...

  6. CentOS7——网络配置

    ip addr #查看当前IP地址信息.(contos7以下的为ifconfig) /etc/sysconfig/network-scripts/ifcfg-*** #***代表不一定的,需要进入该设 ...

  7. loushang框架的开发中关于BSP的使用,将写好的功能模块部署到主页界面结构上

    前言: 当我们已经开发好相应的模块或者功能的时候,需要将这个功能部署在index主页上作为可点击直接使用的模块,而不是每次需要去浏览对应的url地址. 这时候就需要运用到L5的BSP. 作为刚刚入门l ...

  8. background兼容IE9以下版本

    .box {    width:100%;    height:80%;        background: url('img/nav_bg.png') no-repeat;    backgrou ...

  9. jQuery的封装

    封装,最简单的效果就是一个效果你可以重复的去调用   本来前端之路时间不是很长,但是对封装还是有一点点自己个人的理解,曾经踩过的坑也不在少数,最后总结出我个人风格的封装,听一位大神指点过,每个人都有属 ...

  10. click与on的区别

    click只能用于html在注册事件之后没有变化的:on用于html在注册事件后,还会通过JS脚本添加一些按钮,并者希望这些按钮也会有之前注册事件的按钮同样的事件话,就需要用on去为按钮的父节点去注册 ...