aba*_*lta 7 navigation android android-fragments android-jetpack-navigation dagger-hilt
我的应用程序遵循单一活动模式。我的 MainActivity 有一个包含 4 个片段的底部导航。
nav_home和nav_video具有相同的片段,因此我希望 HomeViewModel 和 VideoViewModel 将其状态保留在这些图中。正如你在下面看到的。
nav_home.xml
nav_video.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)
Run Code Online (Sandbox Code Playgroud)
如果我从家里到达这个片段,categoryViewModel 会抛出异常,并显示:
java.lang.IllegalArgumentException: NavController 的返回堆栈上没有 ID 为 2131362218 的目标。当前目的地是 Destination(com.example.app:id/courseDetailFragment) label=CourseDetailFragment class=com.example.app.ui.course.CourseDetailFragment
另一方面,如果我从视频中到达这个片段,homeViewModel 会抛出相同的异常。
任何帮助将受到热烈欢迎。谢谢。
也许你可以用这个:
private val sampleViewModel: SampleViewModel by hiltNavGraphViewModels(findNavController().graph.id)
Run Code Online (Sandbox Code Playgroud)
然而,就我而言,虚拟机甚至在之前就已延迟初始化onCreate(),并且findNavController()当时尚不可用。
这就是我所做的:
fun provideVM(): SampleVM =
hiltNavGraphViewModels<SampleVM>(findNavController().graph.id).value
Run Code Online (Sandbox Code Playgroud)
provideVM()期间被调用onViewCreated()
| 归档时间: |
|
| 查看次数: |
560 次 |
| 最近记录: |