kotlin 如何正确使用StateFlow值?

hfyxw5xn  于 2023-02-24  发布在  Kotlin
关注(0)|答案(1)|浏览(182)

今天我面临着如何正确编写代码的问题。
我有一个Fragment,其中我调用了viewModel函数viewModel.restorePassword()
viewModel中有一个变量:

private var _currentNumberPhone = MutableStateFlow<String>("")
val currentNumberPhone: StateFlow<String> = _currentNumberPhone.asStateFlow()

1)第一个功能

fun restorePassword() {
        viewModelScope.launch {
            currentNumberPhone.collect { phone ->
                restorePasswordByPhone(phone)
            }
        }
}

2)第二功能

fun restorePassword() {
    restorePasswordByPhone(currentNumberPhone.value)
}

restorePasswordByPhone()中,有一个通过Coroutine对网络的调用。这没有什么特别的。我有一个问题,通过订阅和收集或常规currentNumberPhone.value处理StateFlow变量的正确方法是什么?问题是,我不需要一直观察。当我调用restorePassword()方法时,我需要传递currentNumberPhone值,仅此而已。
我不知道有什么区别!

pbpqsu0x

pbpqsu0x1#

当你调用collect时,lambda中的代码会在StateFlow中的值每次改变时运行,直到CoroutineScope或你的集合Job被取消为止。如果你从来不需要这样做,你就根本不需要StateFlow。
如果您发现每次更改StateFlow中的值时,您总是希望调用此恢复密码函数,则使用collect()是有意义的。如果恢复密码函数只是更新另一个流,则您可能根本不需要公开或收集此流,而是简单地将其用作密码流的基础(通过stateIn)。
如果你正在使用一个Flow,很少需要value,除非你可能会使用当前值来决定你在决定什么样的新值时要做什么。除此之外,可能会有一些特殊的情况,你会使用一个一次性的任务的值,* 除了 * 你在收集它时正在做的事情。

相关问题