Невозможно popBackStack() после поворота экрана. Компоненты навигации Android

Я использую NavController: Navigation.findNavController(activity, R.id.statistic_host_fragment). И все ли хорошо, пока я не переверну свое устройство, и после этого я не могу navigate() и popBackStack().

В журналах: FragmentNavigator: игнорирование вызова popBackStack(): FragmentManager уже сохранил свое состояние И FragmentNavigator: игнорирование вызова navigation(): FragmentManager уже сохранил свое состояние

Когда я увидел Google Sample, они ничего не сказали об этой проблеме, там все работает нормально. Вот и не могу понять в чем проблема.

Также, когда я использую MVVM, я сохраняю navController в viewModel и после onCreate() повторно инициализирую контроллер в viewModel. Это решило проблему навигации() после поворота, но я все еще не могу использовать функцию popBackStack(). После этого я пытаюсь использовать Navigation.setViewNavController(), но это не работает.

val destId = currentController.currentDestination?.id

    if (destId != R.id.wikiFragment && destId != R.id.statisticsFragment && destId != R.id.trackerFragment)
        currentController.navigateUp()

и в HomeActivity:

override fun onBackPressed() {
    if (vm.currentController.graph.startDestination == vm.currentController.currentDestination?.id) {
        super.onBackPressed()
    } else {
        vm.currentController.popBackStack()
    }
}

и все источники: https://github.com/SuperCatDev/OverHub/tree/feature/maps


person user294076    schedule 06.03.2019    source источник
comment
Как вы выталкиваете backstack, можете показать код.   -  person Hussnain Haidar    schedule 06.03.2019
comment
Вероятно, вы можете отредактировать свой вопрос. Не размещайте код в комментариях.   -  person Hussnain Haidar    schedule 06.03.2019
comment
Да, это хорошая идея)   -  person user294076    schedule 06.03.2019


Ответы (2)


Решил проблему, извлекая все NavControllers из ViewModel и никогда не сохраняя экземпляр NavController. Используйте методы получения только тогда, когда необходим доступ.

person user294076    schedule 06.03.2019

Хорошо, я несколько часов работал над этой досадной ошибкой и решил ее. Ключ переопределял onResume!

Итак, сделайте одну переменную флага, подобную этой

var completePlayed = false 

И делайте все, что хотите, например, вращение, onSomethingListener и внутри этого значения изменения, как это

completePlayed = true

А затем переопределите onResume

 override fun onResume() {
    super.onResume()
    if(completePlayed){
        navController!!.navigate(R.id.action_chpaterSecondFragment_to_chapterPlayerFragment)
    }else{
        toast("false")
    }

}
person JoyfulJoyce    schedule 12.12.2019