10

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

@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
4

4 回答 4

5

是的,您可以投射@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

于 2020-07-10T19:26:15.463 回答
5

我还没有尝试过这段代码,如果它不能正常工作,请CMiMW,
根据文档here,你可以为应用程序上下文和活动上下文使用预定义的限定符。

您的代码可能如下所示

@ActivityScoped
class UtilsClass @Inject constructor(
@ActivityContext private val activity: Context,
... 
){
 ...
 val myActivity = if(context is MyActivity) context as MyActivity else throw ......  // check if its provided context was desired activity
 ...

}
于 2020-06-23T15:37:11.367 回答
2

只需从上下文中投射/获取活动。但是您也可以根据文档指定类

tailrec fun Context?.activity(): Activity? = this as? Activity
    ?: (this as? ContextWrapper)?.baseContext?.activity()

class MyClass @Inject constructor(@ActivityContext context: Context) {

    init {
        val activity = context.activity() as Activity
    }

    //...
}
于 2021-02-08T15:30:35.707 回答
1

是的,我们不需要这种设置。我们只需要在我们的活动上提供@AndroidEntryPoint,Hilt 就会自己处理依赖注入。同样使用 Hilt,无需编写 Factory 和 InjectorComponents。

于 2020-06-18T07:48:10.877 回答