使用Dagger Hilt向Activity注入依赖触发UninitializedPropertyAccessException错误
Dagger Hilt注入未初始化问题排查与解决
问题场景
需要在Activity中注入DataStoreManager类,相关代码如下:
DataStoreManager类定义:
class DataStoreManager (@ApplicationContext appContext: Context) {...}
提供实例的AppModule:
@Module @InstallIn(SingletonComponent::class) object AppModule { @Provides @Singleton fun provideDataStoreManager(@ApplicationContext appContext: Context): DataStoreManager = DataStoreManager(appContext) }
MainActivity中的调用代码:
@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
问题原因
userPreferencesFlow作为类的直接成员属性,会在MainActivity实例创建阶段(构造函数执行后、Hilt完成注入前)被立即初始化。而@Inject标记的lateinit属性dataStoreManager,要等到Activity的attachBaseContext生命周期之后、onCreate之前才会被Hilt完成注入。此时提前访问未初始化的dataStoreManager就会抛出未初始化异常。
解决方案
可以通过以下两种方式修复:
方式1:使用lazy延迟初始化属性
将userPreferencesFlow改为延迟初始化,直到首次调用时才会访问dataStoreManager,此时Hilt已经完成注入:
@AndroidEntryPoint class MainActivity : AppCompatActivity() { @Inject lateinit var dataStoreManager: DataStoreManager private val userPreferencesFlow by lazy { dataStoreManager.userPreferencesFlow } }
方式2:在onCreate中初始化属性
将属性初始化逻辑移到onCreate方法中,此时Hilt已经完成注入:
@AndroidEntryPoint class MainActivity : AppCompatActivity() { @Inject lateinit var dataStoreManager: DataStoreManager private lateinit var userPreferencesFlow: Flow<UserPreferences> // 替换为实际泛型类型 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) userPreferencesFlow = dataStoreManager.userPreferencesFlow // 后续使用userPreferencesFlow } }
内容的提问来源于stack exchange,提问作者vbp13
相关产品推荐
相关产品推荐

