1.概念
Hilt 是 Android 的依赖项注入库,可减少在项目中执行手动依赖项注入的样板代码。执行手动依赖项注入要求您手动构造每个类及其依赖项,并借助容器重复使用和管理依赖项。
Hilt 通过为项目中的每个 Android 类提供容器并自动管理其生命周期,提供了一种在应用中使用 DI(依赖项注入)的标准方法
1.1 依赖
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.28-alpha'
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"
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
2 Hilt 应用类
所有使用 Hilt 的应用都必须包含一个带有 @HiltAndroidApp 注释的 Application 类。
@HiltAndroidApp
public class ExampleApplication extends Application { ... }
1.将依赖项注入 Android 类
在 Application 类中设置了 Hilt 且有了应用级组件后,Hilt 可以为带有 @AndroidEntryPoint 注释的其他 Android 类提供依赖项:
@AndroidEntryPoint
public class ExampleActivity extends AppCompatActivity { ... }
Hilt 目前支持以下 Android 类:
- Application(通过使用 @HiltAndroidApp)
- Activity
- Fragment
- View
- Service
- BroadcastReceiver
如果您使用 @AndroidEntryPoint 为某个 Android 类添加注释,则还必须为依赖于该类的 Android 类添加注释
- Hilt 仅支持扩展 ComponentActivity 的 Activity,如 AppCompatActivity。
- Hilt 仅支持扩展 androidx.Fragment 的 Fragment。
- Hilt 不支持保留的 Fragment。
@AndroidEntryPoint 会为项目中的每个 Android 类生成一个单独的 Hilt 组件。这些组件可以从它们各自的父类接收依赖项,如组件层次结构中所述。
如需从组件获取依赖项,请使用 @Inject 注释执行字段注入:
@AndroidEntryPoint
public class ExampleActivity extends AppCompatActivity {
@Inject
AnalyticsAdapter analytics;
...
}
Hilt 注入的类的基类,如果是抽象类,则它们不需要 @AndroidEntryPoint 注释。
定义 Hilt 绑定-----构造函数注入
public class AnalyticsAdapter {
private final AnalyticsService service;
@Inject
AnalyticsAdapter(AnalyticsService service) {
this.service = service;
}
...
}
3.Hilt 模块
有时候类型不能通过构造函数注入。如接口
Hilt 模块是一个带有 @Module 注释的类。与 Dagger 模块一样,它会告知 Hilt 如何提供某些类型的实例。与 Dagger 模块不同的是,您必须使用 @InstallIn 为 Hilt 模块添加注释,以告知 Hilt 每个模块将用在或安装在哪个 Android 类中。
使用 @Binds 注入接口实例
public interface AnalyticsService {
void analyticsMethods();
}
public class AnalyticsServiceImpl implements AnalyticsService {
...
@Inject
AnalyticsServiceImpl(...) {
...
}
}
@Module
@InstallIn(ActivityComponent.class)
public abstract class AnalyticsModule {
@Binds
public abstract AnalyticsService bindAnalyticsService(
AnalyticsServiceImpl analyticsServiceImpl
);
}
使用 @Provides 注入实例
接口不是无法通过构造函数注入类型的唯一一种情况。如果某个类不归您所有(因为它来自外部库,如 Retrofit、OkHttpClient 或 Room 数据库等类),或者必须使用构建器模式创建实例,也无法通过构造函数注入。
@Module
@InstallIn(ActivityComponent.class)
public class AnalyticsModule {
@Provides
public static AnalyticsService provideAnalyticsService(
) {
return new Retrofit.Builder()
.baseUrl("https://example.com")
.build()
.create(AnalyticsService.class);
}
}
为 Android 类生成的组件
对于您可以从中执行字段注入的每个 Android 类,都有一个关联的 Hilt 组件,您可以在 @InstallIn 注释中引用该组件。每个 Hilt 组件负责将其绑定注入相应的 Android 类。 Hilt 不会为广播接收器生成组件,因为 Hilt 直接从 ApplicationComponent 注入广播接收器。
项目 | Value |
---|
ApplicationComponent | Application | ActivityRetainedComponent | ViewModel | ActivityComponent | Activity | FragmentComponent | Fragment | ViewComponent | View | ViewWithFragmentComponent | 带有 @WithFragmentBindings 注释的 View | ServiceComponent | Service |
组件生命周期
项目 | Value | xx |
---|
ApplicationComponent | Application#onCreate() | Application#onDestroy() | ActivityRetainedComponent | Activity#onCreate() | Activity#onDestroy() | ActivityComponent | Activity#onCreate() | Activity#onDestroy() | FragmentComponent | Fragment#onAttach() | Fragment#onDestroy() | ViewComponent | View#super() | 视图销毁时 | ViewWithFragmentComponent | View#super() | 视图销毁时 | ServiceComponent | Service#onCreate() | Service#onDestroy() |
组件作用域
默认情况下,Hilt 中的所有绑定都未限定作用域。这意味着,每当应用请求绑定时,Hilt 都会创建所需类型的一个新实例。
|