android - 提供带有 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,
...
){...}
我已经从dagger
to迁移了一个游乐场项目hilt
,它非常顺利,但我偶然发现了这个用例。我已经更改了代码,因此我不再需要该实例,但好奇心仍然存在。
现在我们是否可能不需要这种设置:
@ActivityScope
@ContributesAndroidInjector(modules = [SomeActivityModule::class])
abstract fun someActivity(): SomeActivity
解决方案
是的,您可以投射@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
推荐阅读
- python - 在熊猫数据框中查找列的经度和纬度
- webpack - 带有 Less 和 Source Map 的 Webpack - 奇怪的路径行为
- java - PrintWritter 在 java 中打印 POS 泰米尔语字符
- javascript - `simulate` 的第二个参数应该接受什么?
- symfony - 多个 TransChoice 用法
- c# - 如何将参数从 LINQ 查询传递到 SQL 视图?
- java - 如何使用@PostMapping()?
- android - 如何将现有的 sqlite 表迁移到具有 VCHAR、TIMESTAMP 等数据类型的 ROOM Db?
- android - Android数据绑定 - 找不到属性的getter
- java - Java:方法语句无序执行