我收到此错误:
IllegalStateException:查看android.widget.LinearLayout {649700d V.E ...... ...... I。 0,0-0,0}没有设置NavController
但这仅在浓缩咖啡测试中发生。发生崩溃的代码处理片段上的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: Link does not have a NavController set,但他/她的问题与我的不同。
PS:在生产代码上,此行不会崩溃
答案 0 :(得分:0)
我设法解决了这一问题,方法是替换为:
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)
}
})
Explenation,导航控制器是在我的测试中使用setViewNavController
设置在视图上的,因此我不得不更改生产代码:)