【问题标题】:Can't see DI outside of init block of ViewModel在 ViewModel 的初始化块之外看不到 DI
【发布时间】:2021-06-01 04:34:56
【问题描述】:

我正在尝试通过发送 category_id 来控制片段中的 ViewModel 并将其传递到由 Hilt 注入的存储库。 但是 ViewModel 看不到 init 块之外的存储库。我错过了什么?

@HiltViewModel
class ProjectViewModel @Inject constructor(
repository: ScienceTrackerRepository
) : ViewModel() {

private val _flow = MutableStateFlow(LoadUiState.Success(emptyList()))
val flow: StateFlow<LoadUiState> = _flow.asStateFlow()

fun loadProjects(categoryId: Int) {
    viewModelScope.launch {
        repository.getProjects(categoryId) // unresolved reference "repository"
        repository.flowProjects.collect { feed ->
            _flow.value = LoadUiState.Success(feed)
        }
    }
}

init {
    viewModelScope.launch {
        repository.getProjects(0) 
        repository.flowProjects.collect { feed ->
            _flow.value = LoadUiState.Success(feed)
        }
    }
}
}

【问题讨论】:

    标签: android kotlin android-viewmodel dagger-hilt


    【解决方案1】:

    您需要像这样添加 var 或 val 关键字:

    @HiltViewModel 类 ProjectViewModel @Inject 构造函数( val 存储库:ScienceTrackerRepository ) : ViewModel() {

    }

    访问初始化块之外的构造函数参数。

    【讨论】:

    • @Dmitry 请参阅stackoverflow.com/a/52567485/4704327 了解更多详情
    • var 或 val 都用于创建变量。当我们在构造函数中添加这些关键字时,kotlin 将构造函数参数视为局部变量。如果你想在 kotlin 中创建一个局部变量,那么你必须用它写 val 或 var 否则 kotlin 会给你错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    • 2013-11-02
    相关资源
    最近更新 更多