原文:Dependency Injection on Android with Hilt
作者:Manuel Vivo
译者:Flywith24
译者注:今天看到官方 Jetpack 首页将 Hilt 排在了首项,故找到该文
以下为译文:
依赖项注入(DI)是一种广泛用于编程的技术,非常适合 Android 开发,依赖会提供一个 class 而不是通过创建自己的方式。 通过遵循 DI 原则,您将为良好的应用程序体系结构,更高的代码可重用性和易于测试奠定基础。 您是否曾经尝试过在应用程序中进行手动依赖项注入? 即使使用当今许多现有的依赖项注入库,由于您的项目越来越大,它仍需要大量样板代码,因为您必须手动构造每个类及其依赖项,并创建容器以重用和管理依赖项
通过遵循DI原则,您将为良好的应用程序体系结构,更高的代码可重用性和易于测试奠定基础
Hilt
通过为项目中的每个 Android 类提供容器并为您自动管理其生命周期,新的 Hilt 库定义了一种在应用程序中执行 DI 的 标准方法 (译者注:原文为 standard way 并加粗)。 Hilt 目前处于 Alpha 状态,请在您的应用中进行尝试,并使用 此链接 向我们提供反馈。
Hilt 基于流行的 DI 库 Dagger 构建,因此可以从 Dagger 提供的 编译期正确性,运行时性能,可扩展性 和 Android Studio 支持 中受益。 因此,Dagger 在 Google Play 商店的前 10k 应用中占 74% 的广泛采用率。 但是,由于生成了编译时代码,因此预期编译时间会增加
由于许多 Android framework 类都是由操作系统本身实例化的,因此在 Android 应用中使用 Dagger 时会有一个关联的样板。 与 Dagger 不同,Hilt 与 Jetpack 库和 Android framework 类集成在一起,并删除了大部分样板,使您可以 专注于 定义 和 注入绑定 的重要部分,而不必担心管理所有 Dagger 设置和接入。 它会自动生成并提供:
-
使用 Dagger 整合 Android Framework 类(无需手动创建)的组件
-
Hilt 会自动生成作用范围的注解
-
预绑定和限定
重要的是,由于 Dagger 和 Hilt 可以共存,因此可以根据需要迁移应用程序
Hilt 的使用
为了向您展示 Hilt 的易用性,让我们在一个典型的 Android 应用中执行一些快速 DI。 让我们让 Hilt 将 AnalyticsAdapter 注入到我们的 MainActivity 中
首先,通过使用 @HiltAndroidApp
注解 application 以触发 Hilt 的代码生成,从而在应用程序中启用 Hilt
@HiltAndroidApp
class MyApplication : Application() { ... }
复制代码
然后,通过用 @Inject 注解其构造器来告诉 Hilt 如何提供 AnalyticsAdapter 的实例
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 支持!
您可以在开箱即用的情况下使用喜爱的Jetpack库
在此版本中,我们为 ViewModel 和 WorkManager 提供直接注入支持
例如,将 ViewModel 组件 LoginViewModel 注入到 LoginActivity,可以对 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 支持的更多信息
开始使用 Hilt
如果您对 Hilt 感兴趣,并想进一步了解它,可以通过以下一些资源以自己喜欢的方式学习:
Hilt入门
借助本 指南,了解如何在您的 Android 应用中添加 Hilt
文档
如果您之前不了解 DI 或 Dagger ,请查看 在 Android 中添加 Hilt 指南。如果您已了解 Dagger,我们还将提供 dagger.dev 的文档
如果您只是对新注解以及 Hilt 的功能感兴趣,请在下面的部分中查看该备忘单
对于 Dagger 用户
如果您已经在应用中使用了 Dagger 或 dagger.android,请查看此 迁移指南 或下面提到的 Codelabs ,以帮助您切换到 Hilt。 由于 Dagger 和 Hilt 可以共存,因此您可以逐步迁移应用程序
Codelabs
想要一步步学习 Hilt ,我们提供了两个 codelab
- 在 Android app 中使用 Hilt
- 从 Dagger 迁移到 Hilt
示例代码
您想查看在现有应用中如何使用 Hilt 吗? 在 Google I / O 2020 app 和 Android 体系架构示例Github 仓库 的 dev-hilt
分支中检查其用法
反馈
Hilt 目前处于 Alpha 状态,请在您的应用中进行尝试,并使用此链接向我们提供反馈
备忘单
这个备忘单允许您快速地了解 Hilt 与 Dagger 注解不不同以及如何使用它们
Download cheat sheet in PDF
感谢 Florina Muntenescu and Nick Butcher
关于我
我是 Fly_with24
-
掘金
-
简书
-
Github