Hilt依赖注入框架的使用介绍
引入Hilt
1. 在项目根目录的build.gradle文件中配置Hilt的插件路径:
buildscript {
...
dependencies {
...
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.28-alpha'
}
}
2. 在app/build.gradle文件中,引入Hilt的插件并添加Hilt的依赖库:
...
//apply plugin: 'kotlin-kapt'
apply plugin: 'dagger.hilt.android.plugin'
android {
...
}
dependencies {
implementation "com.google.dagger:hilt-android:2.28-alpha"
//kapt "com.google.dagger:hilt-android-compiler:2.28-alpha"
}
这里同时还引入了kotlin-kapt插件,是因为Hilt是基于编译时注解来实现的,而启用编译时注解功能一定要先添加kotlin-kapt插件。如果你还在用Java开发项目,则可以不引入这个插件,同时将添加注解依赖库时使用的kapt关键字改成annotationProcessor即可
3. 在项目中启用 Java 8,请将以下代码添加到 app/build.gradle 文件中:
android {
...
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
.
.
Hilt的简单使用
使用步骤:
1. 创建MyApplication类
@HiltAndroidApp
public class MyApplication extends Application {
...
}
注:
所有使用 Hilt 的应用都必须包含一个带有 @HiltAndroidApp 注释的 Application 类
- @HiltAndroidApp : 会触发 Hilt 的代码生成操作,生成的代码包括应用的一个基类,该基类充当应用级依赖项容器
2. 将MyApplication注册到你的AndroidManifest.xml文件当中
<application
android:name=".MyApplication"
...>
</application>
3. 将依赖项注入 Android 类
@AndroidEntryPoint
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_launch);
}
}
在 Application 类中设置了 Hilt 且有了应用级组件后,Hilt 可以为带有 @AndroidEntryPoint 注释的其他 Android 类提供依赖项
Hilt 目前支持以下 Android 类:
- Application(通过使用 @HiltAndroidApp)
- Activity
- Fragment
- View
- Service
- BroadcastReceiver
注意:
在 Hilt 对 Android 类的支持方面还要注意以下几点:
Hilt 仅支持扩展 ComponentActivity 的 Activity,如 AppCompatActivity
Hilt 仅支持扩展 androidx.Fragment 的 Fragment
Hilt 不支持保留的 Fragment
4. 创建需要被注入的类
public class MyClass {
@Inject
public void MyClass(){
}
public void addLog(){
Log.d("TAG","我是需要被注入的类");
}
}
向 Hilt 提供绑定信息的一种方法是构造函数注入。在某个类的构造函数中使用 @Inject 注释,以告知 Hilt 如何提供该类的实例
注意:
- Hilt注入的字段是不可以声明成private的
补充: 如果构造函数携带参数,那么需要对参数的类也要依赖注入的相关处理;
例如 :就是MyClass的构造函数中所依赖的所有其他对象都支持依赖注入了,那么MyClass才可以被依赖注入
5. 把创建的类注入到Activity中
@AndroidEntryPoint
public class MainActivity extends AppCompatActivity {
@Inject
MyClass myclass;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_launch);
//调用MyClass里的方法
myclass.