在 Android 中通过 Hilt 进行依赖项注入

在 Android 中通过 Hilt 进行依赖项注入

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:

示例代码

您是否想在现存应用中查看如何使用 Hilt?请查阅以下资源:

反馈

Hilt 目前处于 1.0.0-beta01 版本,如果您在使用中出现任何问题,请及时向我们 反馈问题

备忘单

备忘单 可以让您快速查看 Hilt 和 Dagger 注解的功能差异以及如何使用它们。

版权声明

禁止一切形式的转载-禁止商用-禁止衍生 申请授权

脉脉不得语
脉脉不得语
Zhengzhou Website
Android Developer | https://androiddevtools.cn and https://androidweekly.io WebMaster | GDG Zhengzhou Funder & Ex Organizer | http://Toast.show(∞) Podcast Host

你已经成功订阅到 Android 开发技术周报
太棒了!接下来,完成检验以获得全部访问权限 Android 开发技术周报
欢迎回来!你已经成功登录了。
Unable to sign you in. Please try again.
成功!您的帐户已完全激活,您现在可以访问所有内容。
Error! Stripe checkout failed.
Success! Your billing info is updated.
Error! Billing info update failed.