Android Compose导航中如何传递URI?参数类型该怎么选?
Android Compose导航传递URI的正确方式
在Compose导航中无法直接传递Uri对象,因为导航组件仅支持可序列化的基础类型。正确的做法是将Uri转为字符串传递,再在目标页面解析回Uri,具体实现如下:
1. 定义导航参数与路由
首先要在路由中添加参数占位符,并指定参数类型为字符串:
navigation( startDestination = NavigationItem.ProfileNavigationItem.route, route = PROFILE_ROOT_ROUT ) { composable( // 路由中添加参数占位符 route = "${NavigationItem.ChooseSendProfileNavigation.route}?uri={uri}", arguments = listOf(navArgument("uri") { type = NavType.StringType // 指定参数为字符串类型 nullable = true // 根据业务需求设置是否允许为空 }) ) { navBackStackEntry -> // 获取参数并解析为Uri val uriString = navBackStackEntry.arguments?.getString("uri") val uri = uriString?.let { Uri.parse(it) } ProfileChooseRestoreScreen(uri!!, navHostController, paddingValues) } }
2. 跳转时传递参数
跳转页面时,将Uri转为字符串(若包含特殊字符需编码):
// 处理特殊字符编码 val encodedUri = Uri.encode(targetUri.toString()) // 跳转到目标页面并传递参数 navHostController.navigate("${NavigationItem.ChooseSendProfileNavigation.route}?uri=$encodedUri")
注意事项
- 路由必须包含
?uri={uri}的参数占位符,否则导航组件无法正确识别和传递参数。 - 若URI包含空格、
&等特殊字符,一定要用Uri.encode()编码,避免参数截断或解析失败。
内容的提问来源于stack exchange,提问作者Андрей Дов
相关产品推荐
相关产品推荐

