如何在 Android 中使用 Hilt 在基类中进行字段注入

问题描述 投票:0回答:2

我有一个基本场景,其中需要用 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) {
...
}
android dependency-injection dagger dagger-hilt
2个回答
0
投票

嘿,你可以看看我的库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
注释不会执行任何操作,因为您是手动初始化类而不是从匕首柄获取它。


-1
投票

通过使用“isInitialized”方法,检查lateinit变量是否已初始化。

也可以检查此链接 https://blog.mindorks.com/how-to-check-if-a-lateinit-variable-has-been-initialized

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.