UI не высвечивает действия, после успешной поимки result во fragmentResultListener
Из Фрагмента А я жму на button, открывается ДиалогФрагмент B, в котором один из вариантов действий вызывает ДиалогФрагмент C. Если в нем я жму positiveButton, то я отсылаю в Главный фрагмент A некий result (который в логах видно что успешно ловится) и закрываю ДиалогФрагмент C и B закрываются следующим образом:
setFragmentResult("cat_del_request", bundleOf("cat_del_result" to viewModel.result))
val action = DeleteAllTransInCatDialogDirections.actionDeleteAllTransInCatDialogToCategoriesFragment()
findNavController().navigate(action)
ДиалогФрагмент C и B закрываются оба сразу, ибо action в навигационном файле выглядит так:
<action android:id="@+id/action_deleteAllTransInCatDialog_to_categoriesFragment"
app:destination="@id/categoriesFragment"
app:popUpTo="@id/categoriesFragment"
app:popUpToInclusive="true"/>
Проблема в том что, действия вызываемые result-ом в Фрагменте А (показ Snackbar-a) не происходят. При этом если я посылаю похожий результат в Главный Фрагмент А из другого Диалога, то показ Snackbar происходит. Оба резалта успешно ловятся, что видно в логах. Код обработки result-a идентичный, в коде внизу видно. Все методы отвечающие за показ Snackbara тоже в логах срабатывают. Разные только способы навигации в MainFragment A. Но что конкретно служит причиной бага понять не могу, буду благодарен за подсказки.
UPD Как я понимаю, раз все методы срабатывают, может быть программа думает что snackbar уже показывается, а на деле фрагмент А ресторится на миллисекунды позже. Я пробовал переместить fragmentResultListener из onViewCreated в onResume, но толку ноль.
навигация из Fragment B, после которой Снекбар в основном Фрагменте корректно отображается:
when (it){
is EditCategoryViewModel.EditCatEvent.NavigateBackWithResult -> {
binding.etCatName.clearFocus()
setFragmentResult("add_edit_request", bundleOf("add_edit_result" to it.result))
findNavController().popBackStack()
}
навигация из Диалога C, после которой Snackbar не отображается (а должен):
.setPositiveButton("Yes") { _, _ ->
setFragmentResult("cat_del_request", bundleOf("cat_del_result" to viewModel.result))
val action = DeleteAllTransInCatDialogDirections.actionDeleteAllTransInCatDialogToCategoriesFragment()
findNavController().navigate(action)
viewModel.onConfirmClick()
}
in MainFragment:
setFragmentResultListener("add_edit_request") { _, bundle ->
val result = bundle.getInt("add_edit_result")
viewModel.onAddEditResult(result)
Log.d(TAG, "CatDelResult = $result ")
}
setFragmentResultListener("cat_del_request") { _, bundle ->
val result = bundle.getInt("cat_del_result")
viewModel.onCatDelResult(result)
Log.d(TAG, "CatDelResult = $result ")
}
Main ViewModel:
fun onAddEditResult(result: Int) {
when (result) {
ADD_CATEGORY_RESULT_OK -> showCatSavedConfirmSnackbar("Category saved")
EDIT_CATEGORY_RESULT_OK -> showCatSavedConfirmSnackbar("Category updated")
}
}
fun onCatDelResult(result: Int) {
when (result) {
CAT_DEL_RESULT_COMPLETE_DELETION -> showCatSavedConfirmSnackbar("Category deleted with all its content")
CAT_DEL_RESULT_CONTENT_RELOCATED -> showCatSavedConfirmSnackbar("All the content of deleted category has been successfully relocated to another category")
}
}
private fun showCatSavedConfirmSnackbar(msg: String) = viewModelScope.launch {
categoriesEventChannel.send(CategoriesEvent.ShowCatSavedConfirmMessage(msg)) // sends command to show snackbar
}