我有一个基本场景,其中需要用 Logger 类注入基类。我在下面提到的位置得到
kotlin.UninitializedPropertyAccessException: lateinit property logger has not been initialized
。我缺少什么? (注意:构造函数注入可以工作,但希望避免将记录器添加到子类构造函数中。
@Singleton
open class BaseRepository(private val userService: UserService) {
@Inject lateinit var logger: Logger
init {
CoroutineScope(Dispatchers.Default).launch {
userService.flow.collectLatest {
logger.setUserId(it?.userId) <-- EXCEPTION FROM HERE
}
}
}
...
}
@Singleton
class HomeRepository @Inject constructor(
private val homeService: HomeService,
userService: UserService,
) : BaseRepository(userService) {
...
}
@Singleton
class LibraryRepository @Inject constructor(
private val libraryService: LibraryService,
userService: UserService,
) : BaseRepository(userService) {
...
}
嘿,你可以看看我的库https://github.com/dewantawsif/flexible-hilt。设置完成后你就可以做
open class BaseRepository(private val userService: UserService) {
val logger: Logger = getFromFlexibleHilt()
init {
CoroutineScope(Dispatchers.Default).launch {
userService.flow.collectLatest {
logger.setUserId(it?.userId) <-- EXCEPTION FROM HERE
}
}
}
}
此外,向
@Singleton
添加 BaseRepository
注释不会执行任何操作,因为您是手动初始化类而不是从匕首柄获取它。
通过使用“isInitialized”方法,检查lateinit变量是否已初始化。
也可以检查此链接 https://blog.mindorks.com/how-to-check-if-a-lateinit-variable-has-been-initialized
希望这有帮助。