Hilt

先讲使用,再讲原理

google文档地址:https://developer.android.google.cn/training/dependency-injection/hilt-android?hl=zh_cn

示例源码地址

使用示例: Hilt + ViewModel + Repository

添加依赖

  • 注意事项不要参考google文档中的地址设置版本号,因为文档中使用的是 aplha 版本,API会随时变动,很可能使用此版本但运行结果与文档不同,本人就碰到了,(@HiltViewModel 不可用) *

在项目根目录的 build.gradle 中添加:

1
2
3
4
5
6
7
8
buildscript {
ext.hilt_version = "2.36"

dependencies {
// hilt
classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version"
}
}

在需要使用 hilt 的 module 的 build.gradle 文件中添加依赖

1
2
3
// Hilt
implementation "com.google.dagger:hilt-android:$hilt_version"
kapt "com.google.dagger:hilt-android-compiler:$hilt_version"

Application

1
2
@HiltAndroidApp
class MyApplication : Application() {}

ViewModel

1
2
3
4
5
6
7
8
9
@HiltViewModel
class HiltViewModel @Inject constructor(
var repository: HiltRepository,
): ViewModel() {

fun login() {
repository.login()
}
}

Repository

1
2
3
4
5
6
7
8
9
10
11
12
class HiltRepository @Inject constructor() {
fun login(){
}
}

@Module
@InstallIn(ActivityComponent::class)
object HiltRepositoryModule{

@Provides
fun providerHiltRepository() :HiltRepository = HiltRepository()
}

注意,Repository中即使构造函数无需入参,也必须 使用 @Inject constructor()

Activity

1
2
3
4
5
6
7
8
9
10
11
12
13
@AndroidEntryPoint
class HiltActivity : AppCompatActivity() {

lateinit var binding: ActivityHiltBinding

private val viewModel: HiltViewModel by viewModels()

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityHiltBinding.inflate(layoutInflater)
setContentView(binding.root)
}
}

可以发现,此时生成 viewModel实例时,无需再次传入参数,也不需要另外使用ViewModelFactory来生成。
原因就是在 Repository 中的代码:

1
2
3
4
5
6
7
@Module
@InstallIn(ActivityComponent::class)
object HiltRepositoryModule{

@Provides
fun providerHiltRepository() :HiltRepository = HiltRepository()
}

这里通过注解已经提供了生成 HiltRepository 实例的方式。

以上就是一次简单的使用。

原理解析