🧭 路由定义 · 字符串 · 占位符 · 常量管理

Jetpack Compose 实战
⚡ 4、定义路由:字符串路由定义、路由参数占位符、路由常量管理最佳实践

📌 1. 字符串路由定义

在 Compose Navigation 中,路由本质上是 字符串标识。每个屏幕对应一个唯一路径,支持静态与动态片段。

路由模式定义示例说明
静态路由"home"固定页面,无参数
层级路由"profile/settings"嵌套路径,斜杠分隔
参数占位符"article/{id}"{id} 为动态参数
可选参数"search?query={q}"查询参数风格(需 NavType 解析)

🔖 2. 路由参数占位符

占位符语法 {参数名} 配合 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编码)

🧩 3. 路由常量管理最佳实践 · 架构图

📁 路由常量管理 · 推荐架构 RouteConstants object (单例常量) const val HOME = "home" ArgKey 参数Key常量 const val ARTICLE_ID = "articleId" fun articleRoute(articleId: String): String "article/{articleId}" 模板 + 参数注入 ⭐ ⭐

✅ 4. 路由常量管理最佳实践

📦 代码示例 · 路由常量 + 参数占位符

// ===== 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。