Вы используете viewModel.loginAuthData.observe(this, Observer {})
в onCreateView()
, т. Е. Используете Fragment
(через this
) в качестве LifecycleOwner для своих наблюдений. Это всегда неправильно - вы должны вместо этого использовать viewLifecycleOwner
при наблюдении с onCreateView()
:
viewModel.loginAuthData.observe(viewLifecycleOwner, Observer {
...
})
Как работает LiveData, он продолжает оставаться зарегистрированным до тех пор, пока данный LifecycleOwner
не будет уничтожен. Когда вы передаете this
, он ожидает уничтожения самого фрагмента. Однако фрагменты не уничтожаются в заднем стеке (уничтожается только их представление и, следовательно, viewLifecycleOwner
). Это означает, что оригинал LiveData никогда не отменяет регистрацию своего Обозревателя.
Это означает, что когда onCreateView()
происходит во второй раз (т. Е. Вы нажимаете кнопку «Назад» и представление воссоздается), секунда Наблюдатель создан и зарегистрирован. Теперь у вас есть два Наблюдателя, работающих одновременно. Когда они оба бегут, первый успешно запускается и вызывает navigate()
. Когда запускается второй, NavController уже переместился в следующий пункт назначения, поэтому любые действия, зарегистрированные в предыдущем пункте назначения, больше не найдены, что дает вам IllegalArgumentException
.
При использовании viewLifecycleOwner
, оригиналLiveData корректно уничтожается при разрушении представления фрагмента. Это означает, что при ответном ударе и повторном вызове onCreateView
одновременно активен только один наблюдатель, и вы не столкнетесь с этой проблемой.