我有一个多个活动应用程序,每个活动都有自己的导航图。我可以使用参数启动活动,但我不知道如何正确地将此参数获取到启动目标视图模型中。
我使用以下架构在单个图表中的目的地之间传递参数。这运行良好,但我无法弄清楚如何在不显着改变架构的情况下将参数传递到起始目的地:
视图模型:
@HiltViewModel
class FooViewModel @Inject constructor(
savedStateHandle: SavedStateHandle
): ViewModel {
init {
val param: String = savedStateHandle["foo-param"]
}
}
活动:
@AndroidEntryPoint
class FooActivity : FragmentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
...
val param = intent?.getStringExtra("foo-param") // how do I get this into FooViewModel via the SavedStateHandle
setContent {
AppTheme {
NavHost(
navController = navController,
startDestination = "foo-route/{foo-param}",
) {
composable(
route = "foo-route/{foo-param}",
arguments = listOf(
navArgument("foo-param") { type = NavType.StringType },
),
) {
FooScreen(viewModel = hiltViewModel())
}
}
}
}
}
}
startDestination
不能接受参数。如果设置了其他值,它将始终为您提供 default
值 null
。
如何正确将此参数获取到启动目标视图模型中。
为此,可以采用多种方法,例如:
1. 您可以第一次使用其他路由,例如加载屏幕,然后您可以使用参数路由到您想要的屏幕。
2. 您可以使用
mutableState
观察屏幕的变化,并通过参数更改该值以显示所需的数据。
3. 从数据库获取所需数据后,您还可以使用
viewModel
来处理参数和屏幕导航,直到那时您可以显示加载程序,并在成功获取所需数据后使用参数导航到其他屏幕。