我目前在 Android 上使用
StateFlow
和 SharedFlow
。
订阅
SharedFlow
中的ViewModel
中的Activity
时,使用repeatOnLifecycle()
根据生命周期取消和恢复订阅。
第一次。在这种状态下运行应用程序,显示“100”的吐司消息,然后将应用程序切换到后台状态并再次查看屏幕,再次显示“100”的吐司消息。
我不希望这种事发生。
如果应用程序从后台返回时是相同的值,我不想看到 toast 消息。我该如何处理这个问题??
活动中
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
mainViewModel.a.collect {
Toast.makeText(this@MainActivity, it, Toast.LENGTH_SHORT).show()
}
}
}
视图模型
@HiltViewModel
class MainViewModel @Inject constructor() : ViewModel() {
private val _a = MutableSharedFlow<Int>(replay = 1)
val a = _a.asSharedFlow()
init {
viewModelScope.launch {
_a.emit(100)
}
}
}
这就是 SharedFlow 的行为,它们可以发出相同的值,如果您希望收集器仅收集唯一值,请改用 StateFlow。