我必须遵循
NavHost
:
NavHost(
navController = navController,
startDestination = Destinations.ComposeEntryPointRoute
) {
composable<Destinations.HomeRoute> {
HomeContent()
}
composable<Destinations.GradeConverterRoute> {
GradeConverterScreen(navController = navController, gradeConverterViewModel = DONT KNOW WHAT TO DO HERE)
}
}
我不知道如何将VM传入
GradeConverterScreen
。
我知道,在活动中,我可以做类似的事情:
val gradeConverterViewModel = hiltViewModel<GradeConverterViewModel>()
,然后将该 val 作为参数传递,但我不希望 MainActivity 拥有我需要的每个 VM 的实例。
这是我的
GradeConverterScreen
@Composable
fun GradeConverterScreen(
gradeConverterViewModel: GradeConverterViewModel,
navController: NavController
) {
GradeConverterContent(navController, gradeConverterViewModel.state)
}
@Composable
fun GradeConverterContent(
navController: NavController,
state: GradeConverterState
) {
Column {
......
我有
GradeConverterScreen
和 GradeConverterContent
,因为我知道最好的方法是创建两个可组合项:一个将 VM 作为参数,另一个仅在需要时从 VM 获取状态和方法,这样就可以了我的 @Previews
也没有问题。
我的疑问是:在
NavHost
中,我不应该打电话给GradeConverterScreen
,而应该打电话给GradeConverterContent
??这并不能真正解决我的问题,因为我仍然需要在 NavHost
中将虚拟机的状态作为参数传递,如果我这样做,我将永远不会调用 GradeConverterScreen
。
我正在使用 Hilt 来注入 VM。
如何使用两种可组合方法(
Screen
和Content
)来完成这项工作?
像这样在屏幕关卡中使用 hiltViewModel
@Composable
fun GradeConverterScreen(
gradeConverterViewModel: GradeConverterViewModel = hiltViewModel(),
navController: NavController
)
在导航主机中不需要传递任何东西
composable<Destinations.GradeConverterRoute> {
GradeConverterScreen(navController = navController)
}