У меня есть следующий код в моем фрагменте, подписывающийся на события LiveData моего ViewModel.
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()
}
У меня есть три места в этом коде, куда я звоню navigateUp
, и я бы хотел немного объединить навигацию.
Кажется, что было бы улучшением кода - выдавать ExitRequestedEvent
из каждого случая (успешное добавление, успешное редактирование, ошибка, отмена пользователя) и удалять вызовы navigateUp
из этих событий, но я не уверен насчет гарантий при получении заказа. То есть, если бы я должен был публиковать значения для successfullyAddedEvent
, а затем exitRequestedEvent
в моей модели представления следующим образом:
// yay my thing happened successfully, emit events
successfullyAddedEvent.postValue(Event(contentAdded))
exitRequestedEvent.postValue(Event(ExitReason.AddSuccessful))
Можно ли гарантировать, что я обработаю событие add (которое устанавливает результат для общего результата ViewModel) перед выходом из этого фрагмента, чтобы вызывающий фрагмент всегда имел результат?