Compose Navigation调用activity()跳转时如何向目标Activity传参
可直接使用
activity()方法传递参数,无需中转页 NavGraphBuilder.activity() 扩展本身已经内置了参数自动注入逻辑,和composable()遵循完全一致的参数规则,不需要额外写中转Composable手动构造Intent。
具体实现步骤
- 第一步:在路由路径中声明参数占位符,和普通Compose路由的参数声明规则一致
- 第二步:通过
activity配置块的arguments参数绑定参数的类型规则 - 第三步:跳转时直接通过
navController.navigate()传入拼接好参数的路由即可,Navigation组件会自动将所有路由参数写入启动目标Activity的Intent Extras中,目标Activity直接按常规方式取参即可。
代码示例
路由配置
navigation( startDestination = "home", route = "main" ) { composable("home") { HomeScreen(...) } // 其余Compose屏幕... // 配置带参数的Activity路由 activity(route = "tickets/{config}") { activityClass = ExternalActivity::class // 定义参数解析规则 arguments = listOf( navArgument("config") { type = NavType.StringType // 可按需配置defaultValue、nullable等属性 } ) } }
跳转调用
// 直接传入带参数的路由即可,无需手动构造Intent navController.navigate("tickets/${yourConfigValue}")
目标Activity取参
在ExternalActivity中直接按原生方式取参即可,和手动调用startActivity传参的取值逻辑完全一致:
class ExternalActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val config = intent.getStringExtra("config") // 后续业务逻辑 } }
注意事项
- 如果需要传递
Parcelable/Serializable类型的复杂参数,使用对应类型的NavType即可,比如NavType.SerializableType(Config::class.java),参数同样会被自动写入Intent。 - 不要通过路由传递超过1MB的大对象,受Android原生Binder事务缓冲区限制,大参数请通过ViewModel、本地持久化等跨组件数据共享方案传递。
- 这种实现不会产生中转Composable页带来的回退栈异常、重复触发启动逻辑等副作用,是Navigation组件官方支持的标准用法。
内容的提问来源于stack exchange,提问作者Mario MG
相关产品推荐
相关产品推荐

