DI (依赖项注入) 是一种在程序设计中被宽泛应用的技术,非常适合 Android 开发,该技术能够将依赖项提供给类,从而让类不用本人创立这些依赖。通过遵循 DI 准则,您将为良好的利用架构、更高的代码复用性和便捷的测试奠定根底。您是否尝试过在利用中进行手动依赖项注入?即便应用了当今许多现有的依赖项注入库,随着您的我的项目越来越大,这些库仍须要大量模板代码,因为您必须手动结构每个类及其依赖项,并创立容器用来复用和治理依赖项。
通过遵循 DI 准则,您将为良好的利用架构、更高的代码复用性和便捷的测试奠定根底。
通过为我的项目中的每个 Android 类提供容器并主动治理其生命周期,新的 Hilt 库 定义了一种在利用中进行 DI 的规范形式。Hilt 目前处于 alpha 阶段,请在您的利用中进行尝试,并向咱们 提供反馈。
Hilt 在热门 DI 库 Dagger 的根底上构建而成,因此可能受害于 Dagger 的 编译时正确性、运行时性能、可伸缩性和 Android Studio 反对。如需理解详情,请参阅《Dagger 导航从未如此简略 | Android Studio 4.1》。正因如此,在 Google Play 商店前 10k 的顶级利用中,其中 74% 都宽泛应用了 Dagger。然而,因为在编译期生成代码,构建工夫会有所增加。
因为许多 Android Framework 中的类都是由操作系统本身实例化的,因而在 Android 利用中应用 Dagger 时,会存在与此相关的模板代码。不同于 Dagger,Hilt 集成了 Jetpack 库以及 Android Framework 中的类,并移除了大部分模板代码,使您能够 专一于定义和注入绑定中的重要环节,而无需放心治理 Dagger 的配置和关联。Hilt 能够主动生成并提供如下内容:
- 用于集成 Android Framework 类与 Dagger 的组件,防止了手动创立
- Hilt 主动生成组件的 作用域注解
- 预约义的绑定以及限定符
最重要的是,因为 Dagger 和 Hilt 能够共存,您能够依据须要迁徙利用。
Hilt 实战
为了向您展现 Hilt 的易用性,咱们将通过一个典型的 Android 利用来演示一些疾速 DI。让咱们应用 Hilt 将 AnalyticsAdapter 注入到 MainActivity 中。
首先,在您的 Application 类上增加 @HiltAndroidApp 注解,从而使您的利用开启 Hilt,触发 Hilt 的代码生成:
@HiltAndroidApp
class MyApplication : Application() { ...}
其次,通过应用 @Inject 注解润饰 AnalyticsAdapter 的构造函数,注明 Hilt 如何提供其实例:
class AnalyticsAdapter @Inject constructor() { ...}
第三,为了将 AnalyticsAdapter 实例注入到 MainActivity 中,须要为 Activity 增加 @AndroidEntryPoint 注解以启用 Hilt,并通过 @Inject 注解修饰字段执行注入:
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject lateinit var analytics: AnalyticsAdapter
override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)
// analytics 实例曾经通过 Hilt 赋值,并且能够应用
}
}
更多信息,请在文末备忘单中轻松查看新注解的性能。
对 Jetpack 的反对
您能够通过 Hilt 轻松应用您喜爱的 Jetpack 库。在此版本中,咱们 反对 ViewModel 和 WorkManager 间接注入。
举个例子,向 LoginActivity 中注入一个 组件架构 ViewMode —— LoginViewModelm: 给 LoginViewModel 减少 @ViewModelInject 注解,而后就能够如您所愿在 Activity 或 Fragment 中应用。
class LoginViewModel @ViewModelInject constructor(private val analyticsAdapter: AnalyticsAdapter): ViewModel {...}
@AndroidEntryPoint
class LoginActivity : AppCompatActivity() {private val loginViewModel: LoginViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)
// loginViewModel 曾经能够被应用
}
}
理解无关 Jetpack 反对的更多信息,请查阅: Android 官网文档|Hilt 和 Jetpack 集成
开始应用 Hilt
如果您曾经对 Hilt 感兴趣,并心愿理解更多信息,咱们整顿了如下指南帮您理解如何 将 Hilt 增加到您的 Android 利用
文档
如果您对 DI 或 Dagger 还有些生疏,请查看下面的指南,将 Hilt 增加到 Android 利用。如果您曾经理解 Dagger,请查看 dagger.dev/hilt 内提供的文档。如果您仅想理解新注解以及能够通过 Hilt 做什么,请您查看并珍藏文末的备忘单。
面向 Dagger 使用者
如果您曾经在利用中应用 Dagger 或者 dagger.android,查看 迁徙指南 或者下文提及的 Codelab 能够帮忙您切换到 Hilt。因为 Dagger 和 Hilt 能够共存,您能够逐渐迁徙您的利用。
Codelab
咱们公布了如下两个 Codelab,手把手教您应用 Hilt:
- 在 Android 利用中应用 Hilt
- 将 Dagger 利用迁徙到 Hilt
示例代码
您是否想在现存利用中查看如何应用 Hilt?请查阅以下资源:
- GitHub | Google I/O 2020 利用
- GitHub | Android architecture-samples 仓库的 dev-hilt 分支
反馈
Hilt 目前处于 1.0.0-beta01 版本,如果您在应用中呈现任何问题,请及时向咱们 反馈问题。
备忘单
该 备忘单 能够让您疾速查看 Hilt 和 Dagger 注解的性能差别以及如何应用它们。