目前我有一个
当用户点击订单项时,它将导航到
为了通知和刷新
然后我在
问题来了:当我改变状态并返回页面时,它们都会收到通知并刷新。然而,现在我点击任何订单项目进入编辑页面但什么也不做,然后返回,
一些额外的信息:
ViewPager2
Fragment(作为起始点),它包含两个子 Fragment:ActiveOrderFragment
和 CompletedOrderFragment
,它们都有自己的 ViewModel
来处理 API 调用(获取活动订单和已完成订单)。当用户点击订单项时,它将导航到
OrderEditorFragment
,并且有一个“将项目设置为活动/已完成”按钮,点击该按钮将更新订单的状态(只是一个简单的 PUT 请求),然后返回到 ViewPager2
Fragment。为了通知和刷新
ActiveOrderFragment
和 CompletedOrderFragment
,我在 OrderViewModel
中创建了一个 SharedFlow
,它是一个共享的 ViewModel
。class OrderViewModel(application: Application) : AndroidViewModel(application) {
private val uiScope = viewModelScope
private val _isOrderStatusChanged = MutableSharedFlow<Boolean>(replay = 1)
val isOrderStatusChanged: SharedFlow<Boolean>
get() = _isOrderStatusChanged
fun updateIsOrderStatusChanged() = _isOrderStatusChanged.emit(uiScope, true)
}
然后我在
ActiveOrderFragment
和CompletedOrderFragment
的onCreateView()
中观察(收集)这个SharedFlow
:viewLifecycleOwner.lifecycleScope.launch {
viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.CREATED) {
orderViewModel.isOrderStatusChanged.collect {
if (it) {
Log.v("xxx", "refreshed!")
viewModel.refreshActiveOrders() //similar in CompletedOrderFragment
}
}
}
}
问题来了:当我改变状态并返回页面时,它们都会收到通知并刷新。然而,现在我点击任何订单项目进入编辑页面但什么也不做,然后返回,
collect{}
再次被调用,这不是期望的行为。如何防止这种情况发生?我猜这与replay
属性有关...
一些额外的信息:
StateFlow
而不是SharedFlow
,我选择SharedFlow
是因为它被设计用于一次性事件。 - Sam Chenreplay = 0
。 - Ticherhaz FreePalestine