簡體   English   中英

匕首柄注入活動導致 UninitializedPropertyAccessException 錯誤

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM