是否可以更改在 ViewModel 初始化期间启动的协程的变量值

Is it possible to change the variable value for a coroutine started during ViewModel initialization

我有一个在 Viewmodel 中初始化的 Kotlin 协程 class。像这样

init {
     viewModelScope.launch {
        person.retrievePersonsWithId(<ID VARIABLE>).collect {
            _persons.value = it
        }
    }
}

这个 <ID VARIABLE> 是否可以根据 UI 更改。我想要做的是让这个 Kotlin 协程持续 运行。当 UI 文本更改时能够更改 <ID VARIABLE> 以便协程自动拾取它,而无需取消上述协程并重新创建一个新协程。

首先,我们需要一种方法来观察对此 <ID VARIABLE> 的更改,最好以另一种 ID 流的形式出现。有多种方法可以创建这样的流程,这取决于您的具体情况。最简单的方法之一是将 id 存储在 MutableStateFlow:

private val idFlow = MutableStateFlow(<initial value>)

// change ID value:
idFlow.value = 42

我们使用这个 idFlow 作为 ID 的来源。然后我们需要使用 flatMapLatest 重新初始化另一个,每当 ID 更改时使用 retrievePersonsWithId() 产生的流:

idFlow.flatMapLatest { person.retrievePersonsWithId(it) }.collect {
    _persons.value = it
}