Dagger2:简单使用

226 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 5 天,点击查看活动详情

image.png 上一篇就简单的普及了一下概念,今天记录一下dagger2在android项目中的使用。

依赖

dagger2需要两个依赖:

implementation 'com.google.dagger:dagger:2.44.2'

kapt 'com.google.dagger:dagger-compiler:2.44.2'

需要注意的是,头部应该还要加上:

plugins {
    id 'kotlin-kapt'
}

要不然component就不会生成注入的代码 目前最新的版本是Dagger 2.45,有可以去官网查询最新的版本:Dagger

简单注入一个对象,并使用

class MyFamily @Inject constructor(private val name:String){
    fun familyMember():List<String>{
        return listOf("sophie","leo","catherine","Amy")
    }
}

component interface:

import dagger.Component

@Component
interface ExampleComponent {
    fun inject(mainActivity: MainActivity)
}

这个是必须要写的,这个是注入的入口。

注入一个对象只要在构造函数前面加@Inject就可以了。在kotlin里面是在主constructor前面加,在java里面就是在MyFamily前面加就可以了。 使用的地方如下:

@Inject
lateinit var myFamily: MyFamily
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    DaggerExampleComponent.create().inject(this)
    binding = ActivityMainBinding.inflate(layoutInflater)
    setContentView(binding.root)
    myFamily.familyMember().size.apply {
        Log.i("dagger2example","family size:$this")
    }
}

在需要注入的对象上面加@Inject,现在是不是觉得这个Inject用的地方比较多,第一是在类似声明的地方,第二是在需要注入的对象上面加一个。 注入的入口就是:DaggerExampleComponent.create().inject(this) 大家看这个类名已经不是我们刚才生成的interface的名字,而是前面加了Dagger,这个就是Dagger框架生成的实现类,可以简单的看一下实现类:

public final class DaggerExampleComponent {
  private DaggerExampleComponent() {
  }

  public static Builder builder() {
    return new Builder();
  }

  public static ExampleComponent create() {
    return new Builder().build();
  }

  public static final class Builder {
    private Builder() {
    }

    public ExampleComponent build() {
      return new ExampleComponentImpl();
    }
  }

  private static final class ExampleComponentImpl implements ExampleComponent {
    private final ExampleComponentImpl exampleComponentImpl = this;

    private ExampleComponentImpl() {


    }

    @Override
    public void inject(MainActivity mainActivity) {
      injectMainActivity(mainActivity);
    }

    private MainActivity injectMainActivity(MainActivity instance) {
      MainActivity_MembersInjector.injectMyFamily(instance, new MyFamily());
      return instance;
    }
  }
}

生成的是一个java的代码,除了刚才我们的定义的inject方法,还有一个create和build,以及一个私有的injectMainActivity方法。再看一下方法:

MainActivity_MembersInjector.injectMyFamil
public static void injectMyFamily(MainActivity instance, MyFamily myFamily) {
  instance.myFamily = myFamily;
}

它其实就是给MainActivity里面的myFamily赋值的过程。这也就是myFamily这个变量不能是privte的原因了,因为要通过外部赋值比如不能是私有的,而且在kotlin里面set方法也不能设置为私有的。

这篇文章在我的草稿箱里面放置了一个星期,最近真的是太忙了,没有时间来进行深入的学习。慢慢更新吧。最近也是在项目中慢慢使用,后面再更新dagger其他的知识。