阅读 392

安卓依赖注入(DI)框架Hilt-Dagger入门

0. Why?

  • 为什么需要依赖注入?

答:解耦。

  • 解谁和谁的耦?

解对象创建与对象使用的耦。

  • 如何理解?

此处引出两个概念:IoC容器、DI依赖注入,我们将对象的创建过程、销毁过程交给IoC容器(称为控制反转),在需要使用对象时由容器提供(称为注入),从而减少复杂系统的代码耦合,提高编程效率。

如果大家接触过Spring Boot,就能很轻松的理解,Spring的核心就是IoC容器,及其对Bean(对象)生命周期的管理。

  • Hilt和Dagger的关系?

Hilt是对Dagger的场景化,在Android场景下的封装与使用,因此在引入依赖时需要同时引入Dagger库和Hilt库,并且不可避免的要接触到很多Dagger知识

1. How?

  1. 引入依赖
// 文件名: 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'
}
复制代码
  1. 在Application类上加上@HiltAndroidApp注解(必需, 如果没有自定义Application类,则需要创建一个,并在AndroidManifest文件中声明),作为Dagger容器依附的生命周期的边界。
@HiltAndroidApp
public class App extends Application {
	@Override
    public void onCreate() {
    	...
    }
}
复制代码
  1. 我们以RecyclerAdapter对象为例,说明对象的创建过程
class PictureAdapter @Inject constructor() : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
	override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { .. }
    
    override fun getItemCount(): Int { ... }
}
复制代码

可以看到,对于无参数构造的对象,只需要在构造函数前加上@Inject即可。

  1. 对象的使用
@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的大致原理与使用作简要说明,具体可前往developer.android.com/training/de…,原创文章,禁止转载。

文章分类
Android
文章标签