如何在 NavHost 撰写导航中将 viewModel 作为参数传递

问题描述 投票:0回答:1

我必须遵循

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
)来完成这项工作?

android android-studio android-jetpack-compose android-viewmodel android-navigation
1个回答
0
投票

像这样在屏幕关卡中使用 hiltViewModel

@Composable
fun GradeConverterScreen(
gradeConverterViewModel: GradeConverterViewModel = hiltViewModel(),
navController: NavController
)

在导航主机中不需要传递任何东西

composable<Destinations.GradeConverterRoute> {
   GradeConverterScreen(navController = navController)
}
© www.soinside.com 2019 - 2024. All rights reserved.