Hilt 是 Jetpack 举荐应用的 Android 利用 依赖项注入 (DI) 解决方案,现已 稳固。这意味着 Hilt 曾经齐全能够在 生产环境 中应用。Hilt 相比 Dagger 更加便捷,同时也能帮您缩小模板代码,它专为 Android 而生,并集成了多个 Jetpack 依赖库。很多公司已在他们的利用中应用了 Hilt 并从中获益。
2020 年 6 月,Hilt 首次公布 预览版,它肩负着定义 Android 依赖项注入 规范计划 的使命,也是自那时起,咱们收到了来自开发者的海量反馈。这些反馈不仅改善了 Hilt,而且使咱们明确了咱们走在正确的路线上。
Hilt 无需手动创立依赖项关系图,也无需手动注入并传递类型,而是在编译期主动依据注解生成所需代码。Hilt 通过实现工作中的简单局部以及生成所有模板代码代替手动编写,帮您从 DI 的最佳实际中取得最大收益。此外,Hilt 与 Android 齐全集成,能够帮忙您主动治理 Android Framework 类的依赖项关系图的生命周期。
让咱们通过一个简略示例察看 Hilt 的行为!配置 Hilt 之后,在我的项目中从无到有地向 Activity 注入ViewModel 就像在代码中增加注解一样容易,如下所示:
@HiltAndroidApp // 在利用中配置 Hilt class MyApplication : Application() { ... } // 使 Hilt 辨认该 ViewModel @HiltViewModel class LoginViewModel @Inject constructor( private val savedStateHandle: SavedStateHandle, /*…Hilt 关注的其余依赖项... */ ) : ViewModel() { ... } // 使该 Activity 应用正确的 ViewModel 工厂,并注入其余依赖项 @AndroidEntryPoint class LoginActivity : AppCompatActivity() { private val loginViewModel: LoginViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // loginViewModel 曾经能够应用 } }
除了上述内容,让您在利用中抉择应用 Hilt 还有哪些理由呢?
比 Dagger 更便捷
Hilt 基于风行的 DI 库 Dagger 构建,因而能够从 Dagger 提供的编译期校验、良好的运行时性能、扩展性以及 Android Studio 反对 中受害。一些 Dagger 注解也罕用于 Hilt,例如 @Inject (告知 Dagger/Hilt 如何提供一个类型的实例)。然而 Hilt 要比 Dagger 更便捷。
我强烈推荐利用 Dagger 在 Android 利用中进行依赖项注入,然而单纯地应用 Dagger 可能导致在创立时内存占用过多。当这与 Android 开发中各种简单的可感知生命周期组件一起应用时,就可能呈现很多陷阱,例如内存透露: 作用域为 Activity 的依赖项被意外地传递到 ViewModel 中。专为 Android 量身定制的 Hilt 能够帮忙您避开 Dagger 根本应用的一些陷阱。
——Tinder 资深软件工程师 Marcelo Hernandez
如果您曾经在利用中应用了 Dagger,并且心愿迁徙到 Hilt,无需放心!Dagger 和 Hilt 能够共存,利用能够基于须要进行 迁徙。
更少的模板代码
Hilt 是被定制过的——这意味着为了缩小您编写代码,它替您做了一些决定。Hilt 定义了规范组件及依赖关系图,并且齐全集成了 Android Framework 中的类,例如: Application、Activity、Fragment、View,还定义了限度类型实例的作用域到这些组件的作用域注解。
通过 @HiltAndroidTest 注解,Hilt 能够主动生成测试利用以及测试组件。迁徙到 Hilt 之后,咱们能够删除 20% – 40% 的测试相干模板代码。
——YouTube 软件工程师 Jusun Lee
咱们仅是在 Hilt 迁徙上做了浅层工作。然而,咱们在其中一个迁徙到 Hilt 的模块,看到了代码行数 +72/-182 的变动。
——Tinder 资深软件工程师 Marcelo Hernandez
为 Android 量身定制
不同于 Java 编程语言利用的依赖项注入解决方案 Dagger,Hilt 仅反对 Android 利用。一些注解专供 Hilt 应用,并定义了专有的 Android DI 形式,这些注解包含: @HiltAndroidApp
、@AndroidEntryPoint
、@HiltViewModel
。
最终,Hilt 提供了内置的可辨认 Android 生命周期的 Dagger 组件。应用 Hilt,咱们能够只关注 Dagger @Modules,而不用放心组件,子组件以及组件提供程序的模式等。
—— Tinder 资深软件工程师 Marcelo Hernandez
组件及绑定的标准化
不同于对 Dagger 的意识,Hilt 采纳了 单组件零碎 来简化依赖项关系图,使编译期生成更少的代码。
通过 Hilt 的单组件零碎,仅一次提供绑定定义,就能够在所有应用该组件的类中共享。这比之前有着很大的晋升,YouTube 曾应用多组件零碎,模块须要手动连贯到自定义组件中,并且存在很多反复的绑定定义。
——YouTube 软件工程师 Jusun Lee
因为咱们的 Gradle 模块拆散容许隔离开发性能,这使得咱们应用 Dagger 时容易过于灵便。咱们发现,将这些模块迁徙到 Hilt 暴露出咱们无意间违反了关注点拆散的缺点。
——Tinder 资深软件开发工程师 Marcelo Hernandez
集成其余 Jetpack 库
您能够在开箱即用的状况下应用喜爱的 Jetpack 库。到目前为止,咱们为 ViewModel、WorkManager、Navigation 和 Compose 提供间接注入反对。
参阅 文档,理解更多对于 Jetpack 的反对。
我非常感激 Hilt 与 ViewModel 一起开箱即用的应用形式,以及它打消单纯应用 Dagger 时必须设置的 ViewModel.Factory 模板代码的形式。
——Tinder 资深软件开发工程师 Marcelo Hernandez
Hilt 学习资源
Hilt 是 Jetpack 举荐的 Android 利用 DI 解决方案。想要理解更多并开始在您的利用中应用,请参阅如下资源:
- 理解应用依赖项注入的收益
- 理解如何在您的利用中应用 Hilt
- 从 Dagger 到 Hilt 的迁徙指南
-
Codelabs 中逐渐学习 Hilt 教程:
- 在 Android 利用中应用 Hilt
- 将 Dagger 利用迁徙到 Hilt
-
代码示例:
- Google I/O 2020 利用
- Sunflower 利用
- Hilt 及 Dagger 注解的区别及应用形式的备忘录