首页 > 解决方案 > 提供带有 Hilt 的 Activity 实例

问题描述

我怎样才能翻译这样的东西:

@Module
abstract class BaseActivityModule<A : AppCompatActivity> {
    @Binds
    abstract fun provideActivity(activity: A): AppCompatActivity

    companion object {
        @Provides
        @ActivityContext
        fun provideContext(activity: AppCompatActivity): Context = activity
    }
}

@Module
abstract class SomeActivityModule : BaseActivityModule<SomeActivity>()

所以它可以在后面使用,如:

@ActivityScope
class UtilsClass @Inject constructor(
    private val activity: AppCompatActivity,
    ...
){...}

我已经从daggerto迁移了一个游乐场项目hilt,它非常顺利,但我偶然发现了这个用例。我已经更改了代码,因此我不再需要该实例,但好奇心仍然存在。

现在我们是否可能不需要这种设置:

@ActivityScope
@ContributesAndroidInjector(modules = [SomeActivityModule::class])
abstract fun someActivity(): SomeActivity

标签: androiddagger-2dagger-hilt

解决方案


是的,您可以投射@ActivityContext到您的活动中,继续阅读以获得更多说明。
@ActivityContext可用于限定需要活动上下文的绑定。但类似于 dagger 范围方案,您只能在 范围内的类中进行范围@ActivityScoped,即如果您尝试@ActivityContext在一个类中并将其范围设置为比 更宽的任何其他范围@ActivityScoped,您将面临编译时错误

@dagger.hilt.android.qualifiers.ActivityContext android.content.Context 不能在没有@Provides-annotated 方法的情况下提供

此外,每次创建任何新活动时都会实例化新的绑定对象。
参考https://developer.android.com/training/dependency-injection/hilt-android#component-scopes


推荐阅读