在 Compose Navigation 中,路由本质上是 字符串标识。每个屏幕对应一个唯一路径,支持静态与动态片段。
| 路由模式 | 定义示例 | 说明 |
|---|---|---|
| 静态路由 | "home" | 固定页面,无参数 |
| 层级路由 | "profile/settings" | 嵌套路径,斜杠分隔 |
| 参数占位符 | "article/{id}" | {id} 为动态参数 |
| 可选参数 | "search?query={q}" | 查询参数风格(需 NavType 解析) |
占位符语法 {参数名}
配合 NavArgument 定义类型。支持 String、Int、Long、Float、Boolean 等。
// 导航路由定义 (NavHost) composable( route = "article/{articleId}", arguments = listOf( navArgument("articleId") { type = NavType.StringType defaultValue = "0" } ) ) { backStackEntry -> val articleId = backStackEntry.arguments?.getString("articleId") ?: "0" // 渲染 ArticleScreen(articleId) }
{userId} → String/Int{productId} → Long{page} → Int (可选默认){query} → String (URL编码)object RouteConstants 存放所有路由字符串,避免硬编码散落各处。object ArgKey 统一参数名,防止拼写错误。fun articleDetailRoute(id: String) = "article/$id"。NavType 声明参数类型,并设置默认值处理缺失情况。user/{userId}/profile。// ===== RouteConstants.kt ===== object RouteConstants { const val HOME = "home" const val ARTICLE_DETAIL = "article/{articleId}" const val PROFILE = "profile/{userId}" const val SEARCH = "search?query={query}" } object ArgKey { const val ARTICLE_ID = "articleId" const val USER_ID = "userId" const val QUERY = "query" } // 路由模板函数 —— 构建完整路径 fun NavGraphBuilder.articleDetailScreen( onBack: () -> Unit ) { composable( route = RouteConstants.ARTICLE_DETAIL, arguments = listOf( navArgument(ArgKey.ARTICLE_ID) { type = NavType.StringType defaultValue = "0" } ) ) { entry -> val articleId = entry.arguments?.getString(ArgKey.ARTICLE_ID) ?: "0" ArticleDetailScreen(articleId = articleId, onBack = onBack) } } // 使用常量导航 navController.navigate("article/42") // 直接字符串 navController.navigate(RouteConstants.HOME) // 推荐:引用常量
navArgument 的 defaultValue 和 nullable = true 处理可选参数。对于枚举参数,建议使用 NavType.EnumType 或序列化为 String。