Hilt的使用(动态模块)四

一、前言

动态模块(DFM)是App Bundle 中的一个功能,App Bundle按需分发功能目前只能在Google Play上面使用,所以暂时就不详细介绍 Hilt在动态模块上的使用了,这里只是简单把其它帖子记录下

二、动态模块

动态模块的使用参考以下链接

三、Hilt在动态功能模块的使用

在多模块应用中使用 Hilt
Hilt 代码生成操作需要访问使用 Hilt 的所有 Gradle 模块。编译 Application 类的 Gradle 模块需要在其传递依赖项中包含所有 Hilt 模块和通过构造函数注入的类。

如果多模块项目由常规 Gradle 模块组成,则您可以按照使用 Hilt 实现依赖项注入中的说明使用 Hilt。不过,对于包含动态功能模块 (DFM) 的应用,并不是这样。

在动态功能模块中使用 Hilt
在 DFM 中,通常模块之间相互依赖的方式颠倒过来。因此,Hilt 无法在动态功能模块中处理注释。您必须在 DFM 中使用 Dagger 执行依赖项注入。

您必须使用组件依赖关系来解决 DFM 的这一问题。请按以下步骤操作:

在具有 DFM 所需依赖项的 app 模块(或可由 Hilt 处理的其他任何模块)中声明一个 @EntryPoint 接口。
创建一个依赖于 @EntryPoint 接口的Dagger组件。
在 DFM 中照常使用 Dagger
下面考虑一下使用 Hilt 实现依赖项注入页面中的示例。假设您向项目中添加了一个 login 动态功能模块。您使用一个名为 LoginActivity 的 Activity 实现登录功能。这意味着,您只能从应用组件获取绑定。

对于此功能,您需要具有 authInterceptor 绑定的 OkHttpClient。

首先,创建一个安装在具有 login 模块所需绑定的 ApplicationComponent 中的 @EntryPoint 接口:

@EntryPoint
@InstallIn(ApplicationComponent::class)
interface LoginModuleDependencies {

  @AuthInterceptorOkHttpClient
  fun okHttpClient(): OkHttpClient
}

为了在 LoginActivity 中执行字段注入,创建一个依赖于 @EntryPoint 接口的 Dagger 组件:


@Component(dependencies = [LoginModuleDependencies::class])
interface LoginComponent {

  fun inject(activity: LoginActivity)

  @Component.Builder
  interface Builder {
    fun context(@BindsInstance context: Context): Builder
    fun appDependencies(loginModuleDependencies: LoginModuleDependencies): Builder
    fun build(): LoginComponent
  }
}

完成上述步骤后,在 DFM 中照常使用 Dagger。例如,您可以将来自 ApplicationComponent 的绑定用作类的依赖项:

class LoginAnalyticsAdapter @Inject constructor(
  @AuthInterceptorOkHttpClient okHttpClient: OkHttpClient
) { ... }

为了执行字段注入,使用 applicationContext 创建 Dagger 组件的实例以获取 ApplicationComponent 依赖项:

class LoginActivity : AppCompatActivity() {

  @Inject
  lateinit var loginAnalyticsAdapter: LoginAnalyticsAdapter

  override fun onCreate(savedInstanceState: Bundle?) {
    DaggerLoginComponent.builder()
        .context(this)
        .appDependencies(
          EntryPointsAccessors.fromApplication(
            applicationContext,
            LoginModuleDependencies::class.java
          )
        )
        .build()
        .inject(this)

    super.onCreate(savedInstanceState)
    ...
  }
}

如需详细了解动态功能模块中的模块依赖关系,请参阅包含动态功能模块时的组件依赖关系。

如需详细了解 Dagger 在 Android 上的应用,请参阅在 Android 应用中使用 Dagger。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值