You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者Андрей Дов

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 21:04:57