我的应用程序遵循了单一活动模式。我的MainActivity有一个带有4个片段的底部导航。
nav_home和nav_video具有相同片段,因此我希望HomeViewModel和VideoViewModel在这些图形中保持它们状态如下所示
导航主页.xml
导航视频.xml
在我的片段上,我使用 hiltNavGraphViewModels 扩展来保持视图模型状态。
@AndroidEntryPoint
class CourseDetailFragment : Fragment(R.layout.fragment_course_detail),
LoadingDelegate by LoadingDelegateImpl(), NavigationDelegate by NavigationDelegateImpl() {
private val binding by viewBinding(FragmentCourseDetailBinding::bind)
private val viewModel: CourseDetailViewModel by viewModels()
private val categoryViewModel: CategoryViewModel by hiltNavGraphViewModels(R.id.nav_video)
private val homeViewModel: HomeViewModel by hiltNavGraphViewModels(R.id.nav_home)
如果我从家里访问这个片段,categoryViewModel会抛出异常,它会说:
异常错误:NavController的后台堆栈上没有ID为2131362218的目标。当前目标是Destination(com.example.app:id/courseDetailFragment)label=CourseDetailFragment class=com.example.app.ui.course.CourseDetailFragment
另一方面,如果我从视频访问此片段,homeViewModel将引发相同的异常。
任何帮助都是最受欢迎的。谢谢。
1条答案
按热度按时间xytpbqjk1#
也许你可以用这个:
然而,在我的例子中,vm是延迟初始化的,甚至在
onCreate()
之前,并且findNavController()
在那个时候还不可用。我是这样做的:
在
onViewCreated()
期间调用provideVM()