前言
Hilt 是基于Dagger封装衍生而来,使用起来更加简单,基于上一章Dagger讲解的快递和快递员,Hilt其实就是相当于Dagger2的快递员,以下我们是基于Hilt插件 2.28来讲解,最新的可以看官网最新版。
上一篇-Android Dagger2使用
一. 引用Hilt
- 项目的build.gradle 中引入插件
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.41'
- App的build.gradle 中引入插件
dependencies {
// hilt 的功能支持
implementation 'com.google.dagger:hilt-android:2.28-alpha'
// hilt 自己的注解处理器
annotationProcessor 'com.google.dagger:hilt-android-compiler:2.28-alpha'
}
- App的build.gradle 中应用插件
plugins {
id 'dagger.hilt.android.plugin'
}
二.使用Hilt
- 自定义Application增加注解 @HiltAndroidApp
@HiltAndroidApp
public class MyApplication extends Application {
}
- 创建实体类(快递)
// 正常业务的一个对象
public class UerInfo {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- 创建包裹-->并分发快递
注解 @InstallIn 是告诉用户应用于哪些组件,而应用于哪些组件对应的会有生命周期范围如:ApplicationComponent.class)对应注解@Singleton 存在于应用生命周期。
@InstallIn(ApplicationComponent.class)
@Module
public class UerInfoModle {
@Provides
@Singleton
public UerInfo uerInfoInit(){
return new UerInfo();
}
}
- 使用接收快递
注解 @AndroidEntryPoint 是谁接收就增加注解
- 测试uerInfo1和uerInfo2 地址相同,如果在跳转页面或者在其他类接收也一样。
@AndroidEntryPoint
public class MainActivity extends AppCompatActivity {
@Inject
UerInfo uerInfo1;
@Inject
UerInfo uerInfo2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = findViewById(R.id.txtView);
String msg = "全局-----"+uerInfo1.hashCode()+"----"+uerInfo2.hashCode();
}
}
三.目标组件和组件作用域
- 目标组件
使用目标组件.png例如:如果在Activity中使用就需要使用注解@ActivityComponent
- 组件作用域
1676964687418.png如果在Activity中使用就需要使用注解@ActivityComponent,若在Activity内则单例则使用注解@ActivityScoped
四. Hilt 的@Binds注解
以 AnalyticsService 为例。如果 AnalyticsService 是一个接口,则您无法通过构造函数注入它,而应向 Hilt 提供绑定信息,方法是在 Hilt 模块内创建一个带有 @Binds 注解的抽象函数。@Binds 注解会告知 Hilt 在需要提供接口的实例时要使用哪种实现。
带有注解的函数会向 Hilt 提供以下信息:
- 函数返回类型会告知 Hilt 该函数提供哪个接口的实例。
- 函数参数会告知 Hilt 要提供哪种实现。
接口
public interface AnalyticsService {
void analyticsMethods();
}
AnalyticsServiceImpl的实例
//构造函数被注入,因为Hilt需要知道如何
//提供AnalyticsServiceImpl的实例
public class AnalyticsServiceImpl implements AnalyticsService {
...
@Inject
AnalyticsServiceImpl(...) {
...
}
}
注入实例
@Module
@InstallIn(ActivityComponent.class)
public abstract class AnalyticsModule {
@Binds
public abstract AnalyticsService bindAnalyticsService(
AnalyticsServiceImpl analyticsServiceImpl
);
}
网友评论