[英]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.