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

DI (依赖项注入) 是一种在程序设计中被普遍使用的技术,很是适合 Android 开发,该技术能够将依赖项提供给类,从而让类没必要本身建立这些依赖。经过遵循 DI 原则,您将为良好的应用架构、更高的代码复用性和便捷的测试奠基基础。您是否尝试过在应用中进行手动依赖项注入?即便使用了当今许多现有的依赖项注入库,随着您的项目愈来愈大,这些库仍须要大量模板代码,由于您必须手动构造每一个类及其依赖项,并建立容器用来复用和管理依赖项。android

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

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

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

因为许多 Android Framework 中的类都是由操做系统自身实例化的,所以在 Android 应用中使用 Dagger 时,会存在与此相关的模板代码。不一样于 Dagger,Hilt 集成了 Jetpack 库以及 Android Framework 中的类,并移除了大部分模板代码,使您能够专一于定义和注入绑定中的重要环节,而无需担忧管理 Dagger 的配置和关联。Hilt 能够自动生成并提供以下内容:架构

  • 用于集成 Android Framework 类与 Dagger 的组件,避免了手动建立
  • Hilt 自动生成组件的做用域注解
  • 预约义的绑定以及限定符

最重要的是,因为 Dagger 和 Hilt 能够共存,您能够根据须要迁移应用。ide

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 注解修饰字段执行注入:ui

@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 注解的功能差别以及如何使用它们。

相关文章
相关标签/搜索