【译】Jetpack 推荐的依赖注入,Android 使用 Hilt 进行依赖注入

3,008 阅读5分钟

原文: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

示例代码

您想查看在现有应用中如何使用 Hilt 吗? 在 Google I / O 2020 appAndroid 体系架构示例Github 仓库 dev-hilt 分支中检查其用法

反馈

Hilt 目前处于 Alpha 状态,请在您的应用中进行尝试,并使用此链接向我们提供反馈

备忘单

这个备忘单允许您快速地了解 Hilt 与 Dagger 注解不不同以及如何使用它们

Download cheat sheet in PDF

感谢 Florina Muntenescu and Nick Butcher

关于我

我是 Flywith24,我的博客内容已经分类整理 在这里,点击右上角的 Watch 可以及时获取我的文章更新哦 😉