乐趣区

关于android:在-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:

  • 在 Android 利用中应用 Hilt
  • 将 Dagger 利用迁徙到 Hilt

示例代码

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

  • GitHub | Google I/O 2020 利用
  • GitHub | Android architecture-samples 仓库的 dev-hilt 分支

反馈

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

备忘单

该 备忘单 能够让您疾速查看 Hilt 和 Dagger 注解的性能差别以及如何应用它们。

退出移动版