【问题标题】:Is it possible to change the variable value for a coroutine started during ViewModel initialization是否可以更改在 ViewModel 初始化期间启动的协程的变量值
【发布时间】:2022-01-07 21:16:05
【问题描述】:

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

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

这个&lt;ID VARIABLE&gt; 是否可以根据用户界面进行更改。我想要做的是让这个 Kotlin 协程持续运行。当 UI 文本更改时,可以更改 &lt;ID VARIABLE&gt; 以便协程自动拾取它,而无需取消上述协程并重新创建一个新协程。

【问题讨论】:

  • 你怎么看这个&lt;ID VARIABLE&gt;?可以获取id流吗?
  • 它只是当前存在于 ViewModel 中的一个基本字符串变量,我也愿意对其进行更改,字符串基本上是用户在视图层中输入的任何内容.. 类似于 Android 的片段

标签: android kotlin-coroutines kotlin-flow


【解决方案1】:

首先,我们需要一种方法来观察此&lt;ID VARIABLE&gt; 的变化,最好以另一种 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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 2011-08-01
    • 2020-07-26
    • 2018-02-20
    • 1970-01-01
    • 2018-11-23
    相关资源
    最近更新 更多