android - fragment 恢复时如何避免repeatOnLifecycle一次又一次地执行

标签 android stateflow kotlin-sharedflow

导航回 fragment 时,如何避免再次执行 collect{} 代码。

ViewModel class

    private val _commitResult = MutableStateFlow<Map<String, Any>>(mapOf())
    val commitResult: StateFlow<Map<String, Any>> = _commitResult
Fragment code like this:

    viewLifecycleOwner.lifecycleScope.launch {
            viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED){
                viewModel.commitResult.collect { data ->
                    Logger.i("commitResult $data")
                    //navigate to another fragment
                }
            }
        }
当我首先更改 viewModel 中的 _commitResult 值时,跳转到另一个 fragment 工作正常。
不幸的是,当我回到 fragment 时。 collect{ // navigate to another fragment}将要
再次执行。
我知道什么时候回到 fragment 。 onCreateView 再次执行,viewModel 将发出数据存储
之前,所以 collect { // navigate to another fragment}执行。我怎样才能避免这种情况?
与 LiveData 相同,我使用 Event 通过 LiveData 解决此问题。
open class Event<out T>(private val content: T) {

var hasBeenHandled = false
    private set // Allow external read but not write

/**
 * Returns the content and prevents its use again.
 */
fun getContentIfNotHandled(): T? {
    return if (hasBeenHandled) {
        null
    } else {
        hasBeenHandled = true
        content
    }
}

/**
 * Returns the content, even if it's already been handled.
 */
fun peekContent(): T = content
}
我怎样才能用状态流处理这个?实际上我不喜欢 Event<.> 来处理这个,
我是否以错误的方式使用状态流?我该如何解决这个问题?
如果有人可以提供帮助,请提前致谢。

最佳答案

StateFlow 保持它的状态,所以我建议:
A) 使用 SharedFlow . https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-shared-flow/
B)使用一种模式来处理事件的解除

class Vm: ViewModel() {
  
  private val mEvent = MutableStateFlow<MyResult?>(null)
  val event = mEvent.asStateFlow()

  fun dismissEvent() {
    mEvent.value = null
  }

}

class Frag: Fragment() {
  override fun onViewCreated() {
     vm.event.collect {
       navigate()
       vm.dismissEvent()
     }
  }
}

关于android - fragment 恢复时如何避免repeatOnLifecycle一次又一次地执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69129219/

相关文章:

java -//noinspection ForLoopReplaceableByForEach 是什么意思?

android - 可变状态 VS 可变状态流?

android - 使用 SharedFlow 执行单次操作,无需转换为所需值

android - ui中再次收集StateFlow最后一个值

android - Android 中的群组 VOIP 通话

android - 在 Android 12 上未收到 Firebase 推送通知

android - Android 中的路径测量

android - StateFlow 和 LiveData 有什么区别?

matlab - 在 matlab-simulink/stateflow 中调用 C 函数