График компонента навигации Android перестает работать должным образом, когда я использую navController в обозревателе LiveData - PullRequest
0 голосов
/ 02 декабря 2018

Я использую компонент навигации Android в своем демонстрационном приложении.У меня довольно простой случай.Одно действие, два фрагмента, A и B. Я настроил элементы управления навигацией, как в примере приложения от Google.И когда я пытаюсь открыть фрагмент B из A, используя простой onClickListener, например:

val button.setOnClickListener {
       val action = AFragmentDirections.openFragmentB()
       findNavController().navigate(action)
    }

Все работает нормально.Фрагмент B открывается, и, нажав на кнопку назад, он появляется.Но когда я пытаюсь использовать его из обозревателя LiveData, например:

viewModel.openFragmentB.observe(viewLifecycleOwner, Observer {
        val action = AFragmentDirections.openFragmentB()
        findNavController().navigate(action)
    })

Фрагмент B открывается, но при нажатии кнопки «Назад» происходит сбой приложения с назначением навигации по ошибке com.myapp: id / open_fragmetn_b isнеизвестно этому NavController.

Почему это происходит и как использовать компонент навигации с LiveData?

1 Ответ

0 голосов
/ 02 декабря 2018

Этот сбой происходит потому, что когда вы нажимаете кнопку «Назад», наблюдатель openFragmentB viewmodel снова получает уведомление, и он пытается перейти к фрагменту B, используя действие openFragmentB, но на данный момент текущим назначением NavController по-прежнему является фрагмент B, а фрагмент Bне имеет действия openFragmentB.

Для этого существует несколько решений, простое из которых состоит в том, чтобы добавить в свой наблюдатель проверку, если значение не является нулевым, и в конце установить значение openFragmentB в нулевое значение:

if(it!=null) {
    val action = AFragmentDirections.openFragmentB()
    findNavController().navigate(action)
    viewModel.openFragmentB.value=null
}

Но для лучшего подхода вы можете прочитать о SingleLIveEvent: https://medium.com/androiddevelopers/livedata-with-snackbar-navigation-and-other-events-the-singleliveevent-case-ac2622673150

...