什么是辅助注入
介绍辅助注入
辅助注入,如字面意思,就是辅助的依赖注入。这个辅助,其实是由开发者,也就是我们来辅助Hilt来进行依赖注入。当然这么看起来也是很懵,看一下下面的使用场景介绍应该就能懂个大概了。
辅助注入的使用场景
而辅助注入的使用场景呢?
我们都知道,依赖注入框架可以帮助我们创建实例对象。不过在使用Hilt(或者Dagger,作为一个Android开发,我在下文中都会称为Hilt)这个框架之前,我一直有一个困惑,那就是Hilt是怎么给我创建实例的。
别的时候都还好说,如果创建实例时,需要传入一个可变的var
的参数。比如我要创建一个花的对象,需要在创建时就传入一个花的名字:
var name:String = "Rose"
val flower:Flower = FLower(name)
而交给Hilt要怎么创建呢?毕竟参数是可变的,Hilt怎么知道这个参数是什么呢?
@Inject
latinit var flower:Flower
这个时候就需要用到辅助注入了。
所以辅助注入的使用场景可以概括为:
- 创建实例对象需要参数
- 参数是可变的(不一定是
var
修饰的,val
也可以,主要是想说这个参数不是固定的不变的,否则就能通过@Provide
来创建了)
至于其他场景,比如不需要参数啊,参数是静态不变的,又可以根据不同的类型进行不同的处理,这里就不再赘述,可以看一下我的文章:
辅助注入的发展
辅助注入也经历过时代的发展,在Dagger的早期版本中,是通过@AutoFactory的形式进行辅助注入的。而在Dagger 2.31+版本之后,则是用@AssistedInject。对于Hilt也是一样,使用前一定要检查自己的依赖版本是否支持最新的Assisted Injection。
如何进行辅助注入
准备工作
和其他方式的依赖注入一样,准备工作分为两步。
导入依赖库
implementation "com.google.dagger:hilt-android:2.37"
kapt "com.google.dagger:hilt-android-compiler:2.37"
配置Application
@HiltAndroidApp
class MyApplication : Application()
记得把自定义的Application在Manifest配置一下。
普通类的辅助注入
定义一个带参数的类
在完成准备工作后,我们要先创建一个需要辅助注入的类,这个类的构造方法中包含一个String的参数
class ImageLoader @AssistedInject constructor(
@Assisted
private val imgUrlString: String
) {
override