5

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

视图模型类

    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 值时,跳转到另一个片段工作正常。不幸的是,当我回到片段时。collect{ // navigate to another 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<.> 来处理这个,我是否以错误的方式使用状态流?我该如何解决这个问题?如果有人可以提供帮助,请提前致谢。

4

0 回答 0