是否可以更改在 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
}
我有一个在 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
}