查看原文
其他

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

Android Android 开发者 2021-08-05

DI (依赖项注入) 是一种在程序设计中被广泛使用的技术,非常适合 Android 开发,该技术可以将依赖项提供给类,从而让类不必自己创建这些依赖。通过遵循 DI 原则,您将为良好的应用架构、更高的代码复用性和便捷的测试奠定基础。您是否尝试过在应用中进行手动依赖项注入?即使使用了当今许多现有的依赖项注入库,随着您的项目越来越大,这些库仍需要大量模板代码,因为您必须手动构造每个类及其依赖项,并创建容器用来复用和管理依赖项。


  • DI (依赖项注入)

    https://developer.android.google.cn/training/dependency-injection


通过遵循 DI 原则,您将为良好的应用架构、更高的代码复用性和便捷的测试奠定基础。


通过为项目中的每个 Android 类提供容器并自动管理其生命周期,新的 Hilt 库定义了一种在应用中进行 DI 的标准方式。Hilt 目前处于 alpha 阶段,请在您的应用中进行尝试,并向我们提供反馈


  • Hilt 库

    https://developer.android.google.cn/training/dependency-injection/hilt-android

  • 提供反馈

    https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fgoogle%2Fdagger%2Fissues%2Fnew


Hilt 在热门 DI 库 Dagger 的基础上构建而成,因而能够受益于 Dagger 的编译时正确性、运行时性能、可伸缩性和 Android Studio 支持。如需了解详情,请参阅《Dagger 导航从未如此简单 | Android Studio 4.1。正因如此,在 Google Play 商店前 10k 的顶级应用中,其中 74% 都广泛使用了 Dagger。但是,由于在编译期生成代码,构建时间会有所增加。


  • Dagger

    https://developer.android.google.cn/training/dependency-injection/dagger-basics


由于许多 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 的代码生成:
@HiltAndroidAppclass MyApplication : Application() { ... }


其次,通过使用 @Inject 注解修饰 AnalyticsAdapter 的构造函数,注明 Hilt 如何提供其实例:
class AnalyticsAdapter @Inject constructor() { ... }


第三,为了将 AnalyticsAdapter 实例注入到 MainActivity 中,需要为 Activity 添加 @AndroidEntryPoint 注解以启用 Hilt,并通过 @Inject 注解修饰字段执行注入:
@AndroidEntryPointclass 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 中使用。


  • 组件架构 ViewMode

    https://developer.android.google.cn/topic/libraries/architecture/viewmodel
class LoginViewModel @ViewModelInject constructor( private val analyticsAdapter: AnalyticsAdapter): ViewModel { ... }@AndroidEntryPointclass LoginActivity : AppCompatActivity() { private val loginViewModel: LoginViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) {    super.onCreate(savedInstanceState) // loginViewModel 已经可以被使用 }}


了解有关 Jetpack 支持的更多信息,请查阅: Android 官方文档|Hilt 和 Jetpack 集成

https://developer.android.google.cn/training/dependency-injection/hilt-jetpack



开始使用 Hilt



如果您已经对 Hilt 感兴趣,并希望了解更多信息,我们整理了如下指南帮您了解如何将 Hilt 添加到您的 Android 应用:


  • 指南 | 使用 Hilt 实现依赖项注入
    https://developer.android.google.cn/training/dependency-injection/hilt-android#setup

文档


如果您对 DI 或 Dagger 还有些陌生,请查看上面的指南,将 Hilt 添加到 Android 应用。如果您已经了解 Dagger,请查看 dagger.dev/hilt 内提供的文档。如果您仅想了解新注解以及可以通过 Hilt 做什么,请您查看并收藏文末的备忘单。


面向 Dagger 使用者


如果您已经在应用中使用 Dagger 或者 dagger.android,查看迁移指南或者下文提及的 Codelab 可以帮助您切换到 Hilt。由于 Dagger 和 Hilt 可以共存,您可以逐步迁移您的应用。

  • 迁移指南
    https://dagger.dev/hilt/migration-guide

Codelab


我们发布了如下两个 Codelab,手把手教您使用 Hilt:

  • 在 Android 应用中使用 Hilt
    https://codelabs.developers.google.com/codelabs/android-hilt/
  • 将 Dagger 应用迁移到 Hilt

    https://codelabs.developers.google.com/codelabs/android-dagger-to-hilt/


示例代码


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

  • GitHub | Google I/O 2020 应用

    https://github.com/google/iosched

  • GitHub | Android architecture-samples 仓库的 dev-hilt 分支 
    https://github.com/android/architecture-samples/tree/dev-hilt



反馈



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


  • 反馈问题

    https://github.com/google/dagger/issues/new



备忘单



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


  • Hilt and Dagger 注解的备忘录,PDF 下载地址:

    https://developer.android.google.cn/images/training/dependency-injection/hilt-annotations.pdf


 点击屏末 | 阅读原文 | 即刻使用 Hilt 实现依赖项注入


推荐阅读

如页面未加载,请刷新重试


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存