0. Why?
- 为什么需要依赖注入?
答:解耦。
- 解谁和谁的耦?
解对象创建与对象使用的耦。
- 如何理解?
此处引出两个概念:IoC容器、DI依赖注入,我们将对象的创建过程、销毁过程交给IoC容器(称为控制反转),在需要使用对象时由容器提供(称为注入),从而减少复杂系统的代码耦合,提高编程效率。
如果大家接触过Spring Boot,就能很轻松的理解,Spring的核心就是IoC容器,及其对Bean(对象)生命周期的管理。
- Hilt和Dagger的关系?
Hilt是对Dagger的场景化,在Android场景下的封装与使用,因此在引入依赖时需要同时引入Dagger库和Hilt库,并且不可避免的要接触到很多Dagger知识
1. How?
- 引入依赖
// 文件名: build.gradle (根目录)
buildscript {
...
dependencies {
...
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.28-alpha'
}
}
// 文件名: build.gradle (:app)
apply plugin: 'com.android.application'
apply plugin: 'kotlin-kapt'
apply plugin: 'dagger.hilt.android.plugin'
...
dependencies {
...
implementation "com.google.dagger:hilt-android:2.28-alpha"
kapt "com.google.dagger:hilt-android-compiler:2.28-alpha"
implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha02'
kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha02'
}
- 在Application类上加上@HiltAndroidApp注解(必需, 如果没有自定义Application类,则需要创建一个,并在AndroidManifest文件中声明),作为Dagger容器依附的生命周期的边界。
@HiltAndroidApp
public class App extends Application {
@Override
public void onCreate() {
...
}
}
- 我们以RecyclerAdapter对象为例,说明对象的创建过程
class PictureAdapter @Inject constructor() : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { .. }
override fun getItemCount(): Int { ... }
}
可以看到,对于无参数构造的对象,只需要在构造函数前加上@Inject即可。
- 对象的使用
@AndroidEntryPoint
class HomeActivity : AppCompatActivity() {
// 只需要在声明对象的地方加上@Inject lateinit即可在后面直接使用,对象的创建、赋值操作交由Hilt处理
@Inject
lateinit var pictureAdapter: PictureAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
...
// 直接赋给RecyclerView的adapter
pictureRecyclerView.setAdapter(pictureAdapter)
}
}
可以看到,对于Activity类,只需要在类上加上@AndroidEntryPoint注解,然后在需要注入的变量上加上@Inject lateinit即可。
本文只对Hilt的大致原理与使用作简要说明,具体可前往https://developer.android.com/training/dependency-injection/hilt-android,原创文章,禁止转载。