如何使用 Hilt 访问 attachBaseContext 中的注入属性?

moh*_*aee 3 android dependency-injection dagger-hilt

为了更改应用程序的默认值Locale,我必须在Activity内部的方法中访问我的WrapContext类:attachBaseContext

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {

    @Inject lateinit var wrapper: WrapContext

    .
    .
    .

    override fun attachBaseContext(newBase: Context?) {
        super.attachBaseContext(wrapper.setLocale(newBase!!))
    }
}
Run Code Online (Sandbox Code Playgroud)

但是正如您可以想象的那样,nullPointerException因为该字段是在attachBaseContext调用后注入的。

这是WrapContext类:

@Singleton
class WrapContext @Inject constructor() {

    fun setLocale(context: Context): Context {
        return setLocale(context, language)
    }

    .
    .
    .
}
Run Code Online (Sandbox Code Playgroud)

我还尝试在MyApp类中注入WrapContext以便在Activity 中调用它时应该初始化该字段。

@HiltAndroidApp
class MyApp : Application() {
    @Inject lateinit var wrapper: WrapContext
}
Run Code Online (Sandbox Code Playgroud)

attachBaseContext 内部活动:

override fun attachBaseContext(newBase: Context?) {
    super.attachBaseContext((applicationContext as MyApp).wrapper.setLocale(newBase!!))
}
Run Code Online (Sandbox Code Playgroud)

但我仍然得到同样的错误。我调试了代码,发现方法中的applicationContext值为Null

我在网上搜索,发现有人在dagger 这里遇到了同样的问题。但是没有公认的答案可以让我在hilt.

有没有办法在活动内部WrapContextattachBaseContext方法中获取这个类?

小智 5

一旦您附加到您的应用程序,您就可以使用入口点从中获取依赖。幸运的是,这样的上下文被传递到:ApplicationComponentContextattachBaseContext


    @EntryPoint
    @InstallIn(ApplicationComponent::class)
    interface WrapperEntryPoint {
        val wrapper: WrapContext
    }

    override fun attachBaseContext(newBase: Context) {
        val wrapper = EntryPointAccessors.fromApplication(newBase, WrapperEntryPoint::class).wrapper
        super.attachBaseContext(wrapper.setLocale(newBase))
    }
Run Code Online (Sandbox Code Playgroud)

  • 这对我不起作用,因为“Application#attachBaseContext()”方法中的“context.getApplicationContext()”为 NULL。但它确实在“Activity”类中有效。 (4认同)