Я получаю эту ошибку:
IllegalStateException: View android.widget.LinearLayout{649700d V.E...... ......I. 0,0-0,0} does not have a NavController set
Но это происходит только на эспрессо-тестах. Код, в котором происходит сбой, обрабатывает onBackPressed моего фрагмента:
val navController = Navigation.findNavController(view)//this line here
requireActivity().onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
navController.popBackStack(R.id.homeFragment, false)
}
})
Это мой тест на эспрессо:
@Test
fun testBackButton() {
val mockNavController = mock(NavController::class.java)
settingsFragmentScenario = launchFragmentInContainer()
settingsFragmentScenario.onFragment {
Navigation.setViewNavController(it.requireView(), mockNavController)
}
performClickOnViews(android.R.id.home)
verify(mockNavController).navigate(R.id.home)
}
Если я удалю свой код на фрагменте, тесты запустятся без ошибок (кроме того, что я утверждаю неправильно)
Я проверил: IllegalStateException: ссылка не имеет набора NavController, но его/ее проблема не такая, как у меня.
PS: в производственном коде эта строка не падает
Мне удалось решить эту проблему, заменив:
val navController = Navigation.findNavController(view)//this line here
requireActivity().onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
navController.popBackStack(R.id.homeFragment, false)
}
})
С участием:
requireActivity().onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
view.findNavController().popBackStack(R.id.homeFragment, false)
}
})
Объяснение, навигационный контроллер установлен в представлении в моем тесте с помощью setViewNavController
, поэтому мне пришлось изменить свой производственный код :)
У меня почти такая же проблема, но я не могу ее исправить :( Можете ли вы помочь: stackoverflow.com/questions/62515314/…