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.
有没有办法在活动内部WrapContext的attachBaseContext方法中获取这个类?
小智 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)
| 归档时间: |
|
| 查看次数: |
407 次 |
| 最近记录: |