使用 Kotlin 构建 MVVM 应用程序—提高篇:Dagger-Android

栏目: 编程工具 · 发布时间: 6年前

内容简介:本篇是对于在依赖注入 Dagger2 这篇文章中,我们了解了 Dagger2 是如何进行依赖注入的。可以简单的将Dagger2理解成android应用的依赖管理工具。既然Dagger2已经可以满足我们日常的开发需要了,那么Dagger-Android又是拿来干什么的呢?

写在前面

本篇是对于 使用Kotlin构建MVVM应用程序—第四部分:依赖注入 Dagger2 的补充。

在依赖注入 Dagger2 这篇文章中,我们了解了 Dagger2 是如何进行依赖注入的。

可以简单的将Dagger2理解成android应用的依赖管理工具。既然Dagger2已经可以满足我们日常的开发需要了,那么Dagger-Android又是拿来干什么的呢?

为什么要有Dagger-Android?

对于这个问题,google在 Dagger-Android 的文档上有解释:

我们普通的dagger代码如下所示:

public class FrombulationActivity extends Activity {
  @Inject Frombulator frombulator;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // DO THIS FIRST. Otherwise frombulator might be null!
    ((SomeApplicationBaseType) getContext().getApplicationContext())
        .getApplicationComponent()
        .newActivityComponentBuilder()
        .activity(this)
        .build()
        .inject(this);
    // ... now you can write the exciting code
  }
}

这会带来一些问题:

  1. 只是复制粘贴上面的代码会让以后的重构比较困难,还会让一些开发者不知道Dagger到底是如何进行注入的(然后就更不易理解了)
  2. 更重要的原因是:它要求注射类型(FrombulationActivity)知道其注射器。 即使这是通过接口而不是具体类型完成的,它打破了依赖注入的核心原则:一个类不应该知道如何实现依赖注入。

为了解决上述的问题,Dagger-Android应运而生。

Dagger-Android

首先我们需要在app/build.gradle加入相应的依赖

//dagger2  di
    implementation 'com.google.dagger:dagger:2.16'
    kapt 'com.google.dagger:dagger-compiler:2.16'
    //dagger-android
    implementation 'com.google.dagger:dagger-android:2.16'
    implementation 'com.google.dagger:dagger-android-support:2.16' 
    kapt 'com.google.dagger:dagger-android-processor:2.16'

注入方法建议看 文档 更好,这里简单描述一下:

还是以 MVVM-android 为例。

  1. 添加ActivityModule.kt
@Module
abstract class ActivityModule {

    @ContributesAndroidInjector
    abstract fun contributePaoActivity(): PaoActivity

}

2 . 修改AppComponent.kt

@Singleton
@Component(modules = arrayOf(
        AndroidInjectionModule::class,
        AppModule::class,
        ActivityModule::class)
)
interface AppComponent {

    @Component.Builder
    interface Builder {
        @BindsInstance
        fun application(application: Application): Builder

        fun build(): AppComponent
    }

    fun inject(application: PaoApp)
}

相比Dagger2,modules多了AndroidInjectionModule和ActivityModule两个类。

3 . rebuild一下项目,然后新增PaoApp.kt同时实现HasActivityInjector接口

class PaoApp : Application(),HasActivityInjector{

    @Inject
    lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Activity>

    override fun onCreate() {
        super.onCreate()
        DaggerAppComponent.builder().application(app).build().inject(app)
    }

    override fun activityInjector() = dispatchingAndroidInjector

}

4 . 最后在Activity的onCreate()方法之前调用 AndroidInjection.inject(this) 进行注入

class PaoActivity : RxAppCompatActivity() {
    @Inject
    lateinit var mViewModel : PaoViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        //////di
        AndroidInjection.inject(this)
        super.onCreate(savedInstanceState)
    }
}

到此,一个简单的依赖注入就好了。

当然简单是绝不简单的。这些是在写什么?完全云里雾里。刚从Dagger转换成Dagger-Android的直接就劝退了,还不如直接使用Dagger2的好。

确实,对于日常功能迭代的开发团队来说,普通的dagger更易理解,所以Dagger-Android也算是一个可选项,可以作为一个提高,而且google的很多示例里dagger的用法都是Dagger-Android,所以还是有必要懂它的原理。

原理剖析

在第四部分中,我们也了解了普通的Dagger是如何进行依赖注入的,这里我们再来回顾一次

由AppModule提供所需的依赖
由AppCompent提供注入的途径
由@Inject标识需要注入的对象
调用
DaggerAppComponent.builder()
   .appModule(AppModule(applicationContext)).build()
   .inject(this)
完成依赖注入

这里的逻辑比较好理解一些,就是普通的

paoActivity.mViewModel = appComponent.paoViewModel

那Dagger-Android相比之下,又是怎么样的逻辑呢?

相比之前,Dagger-Android将Activity/Fragment所需的compoent都放到了一个map对象里,这个map对象由App的 dispatchingAndroidInjector 对象持有。其中 key 值为activity/fragment的class, value 为提供相应Component的Provider对象。

Map<Class<? extends T>, Provider<AndroidInjector.Factory<? extends T>>>

当我们在Activity中调用 AndroidInjection.inject(this) 时,又在做什么呢?

```java

public static void inject(Activity activity) {

checkNotNull(activity, "activity");

Application application = activity.getApplication();

if (!(application instanceof HasActivityInjector)) {

throw new RuntimeException(


以上所述就是小编给大家介绍的《使用 Kotlin 构建 MVVM 应用程序—提高篇:Dagger-Android》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

C++沉思录

C++沉思录

Andrew Koenig、Barbara Moo / 黄晓春、孟岩(审校) / 人民邮电出版社 / 2008-1 / 55.00元

《C++沉思录》基于作者在知名技术杂志发表的技术文章、世界各地发表的演讲以及斯坦福大学的课程讲义整理、写作而成,融聚了作者10多年C++程序生涯的真知灼见。全书分为6篇32章,分别对C++语言的历史和特点、类和继承、STL与泛型编程、库的设计等几大技术话题进行了详细而深入的讨论,细微之处几乎涵盖了C++所有的设计思想和技术细节。全书通过精心挑选的实例,向读者传达先进的程序设计的方法和理念。一起来看看 《C++沉思录》 这本书的介绍吧!

html转js在线工具
html转js在线工具

html转js在线工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具