[英]Dagger hilt injecting into activity results in UninitializedPropertyAccessException error
我正在尝试使用模块将 class 注入到使用匕首柄的活动中。 我浏览了教程和无数 SO 帖子。 我不知道我做错了什么。
我有一个要在活动中使用的 DataStoreManger class。
class DataStoreManager (@ApplicationContext appContext: Context) {...}
我有一个提供 DataStoreManager 的 AppModule。
@Module
@InstallIn(SingletonComponent::class)
object AppModule {
@Provides
@Singleton
fun provideDataStoreManager(@ApplicationContext appContext: Context):
DataStoreManager = DataStoreManager(appContext)
}
然后我尝试在 MainActivity 中使用 DataStoreManager。
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject lateinit var dataStoreManager: DataStoreManager
private val userPreferencesFlow = dataStoreManager.userPreferencesFlow
}
这导致未初始化的属性访问异常
Caused by: kotlin.UninitializedPropertyAccessException: lateinit property
dataStoreManager has not been initialized
当你使用
@Inject lateinit var dataStoreManager
dataStoreManager
仅在调用super.onCreate()
期间实际注入。
但是,当您创建诸如
private val userPreferencesFlow = dataStoreManager.userPreferencesFlow
此属性是作为MainActivity
class 构造的一部分立即创建的 - 它不会等到onCreate()
运行,因此您会收到错误。
通常,避免这种情况的最简单方法是仅在您真正想要收集时从注入的管理器访问userPreferencesFlow
,这大概是在super.onCreate()
之后。
但是,如果您仍想在活动级别将流创建为成员变量,则可以使用by lazy
:
private val userPreferencesFlow by lazy {
dataStoreManager.userPreferencesFlow
}
lazy
块只会被惰性地执行——例如,当你第一次真正使用成员变量时,从而确保你的@Inject
变量确实被注入了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.