我目前有一个使用“一个活动-多个片段”方法的应用程序,并且在该应用程序中是一个与其子级共享重要数据的片段,因此我使用了 navGraphViewModels 范围为嵌套导航图,如下所示:
private val viewModel by navGraphViewModels<MySharedViewModel>(R.id.nested_nav_graph)
Run Code Online (Sandbox Code Playgroud)
父片段包含一个 viewPager,并且传递给该 viewPager 的片段都与父片段共享相同的 viewModel。我使用这种方法的问题是,当涉及使用 Espresso 进行涉及 navGraphViewModels 的 UI 测试时,我收到错误“View XXX 没有设置 NavController”。我设法通过以下内容修复了父片段的问题:
val navController = TestNavHostController(ApplicationProvider.getApplicationContext())
// This allows fragments to use by navGraphViewModels()
navController.setViewModelStore(ViewModelStore())
UiThreadStatement.runOnUiThread {
navController.setGraph(R.navigation.nested_nav_graph)
}
val scenario =
launchFragmentInContainer(themeResId = R.style.AppTheme) {
MyFragment().also { fragment ->
fragment.viewLifecycleOwnerLiveData.observeForever { viewLifecycleOwner ->
if (viewLifecycleOwner != null) {
Navigation.setViewNavController(fragment.requireView(), navController)
}
}
}
}
return navController
}
Run Code Online (Sandbox Code Playgroud)
但是,由于父片段随后将其子片段加载到 viewPager 中,并且这些子片段也需要 NavController,因此我的测试不会继续经过 @Before 块。任何有关如何将 navController 设置为子片段的帮助将不胜感激。
android android-fragments android-viewpager android-navigation android-espresso
android ×1