今天我面临着如何正确编写代码的问题。
我有一个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值,仅此而已。
我不知道有什么区别!
1条答案
按热度按时间pbpqsu0x1#
当你调用
collect
时,lambda中的代码会在StateFlow中的值每次改变时运行,直到CoroutineScope或你的集合Job被取消为止。如果你从来不需要这样做,你就根本不需要StateFlow。如果您发现每次更改StateFlow中的值时,您总是希望调用此恢复密码函数,则使用
collect()
是有意义的。如果恢复密码函数只是更新另一个流,则您可能根本不需要公开或收集此流,而是简单地将其用作密码流的基础(通过stateIn
)。如果你正在使用一个Flow,很少需要
value
,除非你可能会使用当前值来决定你在决定什么样的新值时要做什么。除此之外,可能会有一些特殊的情况,你会使用一个一次性的任务的值,* 除了 * 你在收集它时正在做的事情。