我的Fragment中有以下代码,用于订阅ViewModel的LiveData事件。
viewModel.successfullyAddedEvent.observeEvent(this){
// do result handling by shared view model to the calling fragment
result.successfullyAddedEvent.postValue(Event(it))
findNavController().navigateUp()
}
viewModel.successfullyEditedEvent.observeEvent(this){
// do result handling by shared view model to the calling fragment
result.successfullyEditedEvent.postValue(Event(it))
findNavController().navigateUp()
}
viewModel.exitRequestedEvent.observeEvent(this){
when(it){
ExitReason.GetDetailsFailed -> {
Toast.makeText(context, R.string.details_load_error, LENGTH_SHORT).show()
}
ExitReason.UserCanceled -> { /* happy path */ }
}
findNavController().navigateUp()
}
在这段代码中,我有3个地方叫navigateUp
,我想稍微统一一下导航。
从每种情况(成功添加,成功编辑,错误情况,用户取消)发出ExitRequestedEvent
并从这些事件中删除对navigateUp
的调用似乎是对代码的改进。我不确定收货单上的担保。也就是说,如果我要在视图模型中发布successfullyAddedEvent
然后是exitRequestedEvent
的值,如下所示:
// yay my thing happened successfully, emit events
successfullyAddedEvent.postValue(Event(contentAdded))
exitRequestedEvent.postValue(Event(ExitReason.AddSuccessful))
我可以保证在退出该片段之前会处理add事件(将结果设置在共享结果ViewModel上),以便调用片段始终有结果吗?
答案 0 :(得分:1)
根据documentation,postValue
仅表示将任务发布到主线程(如果不在线程上),因此,除非代码中也有setValue
,否则顺序应该得到保证。
如果您想绝对保证顺序(即使不是必需的),则可以使用setValue()
,但是必须确保它在主线程上发生。