Skip to content

[zh]GNav 路由框架,自动注册,自动生成 goXXX 拓展函数,自动生成 getXXXRoute 函数,支持拦截器 [en]GNav routing framework, automatic registration, automatic generation of goXXX extension functions, automatic generation of getXXXRoute functions, support for interceptors

Notifications You must be signed in to change notification settings

a765032380/GNav

Repository files navigation

highlight
a11y-dark

English | 简体中文

GNav - Compose 导航框架:告别样板代码,自动注册,零配置

GNav Multiplatform 基于 KMP 的跨平台方案,第一版已开发完成。 GNav Multiplatform on GitHub

项目概述

GNav 是一个基于 Jetpack Compose Navigation 的现代化导航框架,通过注解处理和自动化代码生成技术,彻底简化了 Compose 应用中的导航配置和管理。它不仅仅是一个工具库,更代表了一种全新的导航编程范式。 ** 项目地址: ** GNav on GitHub

核心价值

🚀 开发效率提升

  • ** 自动生成 ** 导航相关代码,减少90%的样板代码
  • ** 编译时类型检查 ** ,彻底告别运行时路由错误
  • ** 智能参数解析 ** ,自动处理类型转换和安全空值处理

🛡️ 代码质量保障

  • ** 类型安全 ** 的导航函数,避免字符串拼接错误
  • ** 模块化设计 ** ,清晰的职责分离,便于维护和扩展
  • ** 与现有 Jetpack Compose Navigation 完全兼容 ** ,平滑迁移

💪 企业级功能

  • ** 内置拦截器机制 ** ,支持权限校验、登录验证等业务场景
  • ** 完整的统计分析 ** 接口,轻松集成用户行为追踪
  • ** 丰富的动画支持 ** ,提供流畅的页面切换体验

快速开始

1. 添加依赖

build.gradle.kts中添加:

dependencies {
    implementation("pub.gll:nav:1.0.2")
    ksp("pub.gll:nav-processor:1.0.2")
}

2. 声明页面

使用 @NavPage注解标记 Composable 函数:

@NavPage(interceptors = [AuthInterceptor::class])
@Composable
fun HomePage(userId: String) {
    // 页面内容 - 参数自动解析,类型安全
}

//框架会自动解析方法中userId和from,自动生成带参数的跳转方法
@NavPage
@Composable  
fun ProfilePage(userId: Int, from: String) {
    // 支持可选参数和自定义路由
}

3. 配置导航宿主

@Composable
fun App() {
    GNavCompose(
        startDestination = getHomeRoute(),
        //navAnalytics 可选参数,如果不需要统计,可以不写
        navAnalytics = object : NavAnalytics {
            override fun onPageEnter(currentRoute: String, previousRoute: String?, params: Map<String, Any?>) {
                // 页面进入统计
            }
            override fun onPageExit(currentRoute: String) {
                // 页面退出统计
            }
        }
    )
}

4. 执行 Build

执行build 任务后,会自动生成路由注册代码和扩展函数代码。

5. 执行导航操作

// 方式1:使用生成的类型安全扩展函数
navController.goHome("user123")

// 方式2:使用全局导航API  
GNav.navigate(getProfileRoute(123))

// 方式3:协程环境安全导航
viewModelScope.launch {
    GNav.navigateSuspend(getDetailRoute(itemId))
}

核心特性详解

✨ 智能路由注册

** 传统方式 vs GNav: **

// ❌ 传统方式:手动注册,容易出错
NavHost(navController, "home") {
    composable("home") { HomePage() }
    composable("detail/{id}") { backStackEntry ->
        val id = backStackEntry.arguments?.getString("id") ?: ""
        DetailPage(id)
    }
}
// ❌ 传统方式跳转 :需要写魔法值,容易出错
navController.navigate("home")

// ✅ GNav:自动注册,类型安全
@NavPage 
@Composable 
fun HomePage(){
    //todo 页面内容
}

@NavPage 
@Composable 
fun DetailPage(id: String){
    //todo 页面内容
}
//✅ GNav:跳转 使用框架自动生成的拓展函数进行跳转
//无需魔法值,无需考虑传参错误,无需考虑拦截器,拦截器由目标页面实现,解耦更彻底

val navController = LocalNavController.current
navController.goHome()
navController.goDetail(id)

** 路由配置选项: **

  • ** 自动路由生成 ** :基于函数名智能生成(如 UserProfilePageuser_profile
  • ** 自定义路由 ** :支持显式指定复杂路由路径
  • ** 参数路由 ** :自动处理参数占位符和类型映射

🛡️ 强大的拦截器系统

class AuthInterceptor : GNavInterceptor {
    override fun shouldIntercept(navController: NavController, route: String): Boolean {
        if (requiresAuth(route) && !UserSession.isLoggedIn) {
            showToast("请先登录")
            return true // 拦截原导航
        }
        return false // 放行
    }
}

// 应用拦截器
@NavPage(interceptors = [AuthInterceptor::class, LoggingInterceptor::class])
@Composable 
fun UserProfilePage(){

}

📊 企业级统计分析

class BusinessAnalytics : NavAnalytics {
    override fun onPageEnter(currentRoute: String, previousRoute: String?, params: Map<String, Any?>) {
        analytics.track("page_view", mapOf(
            "page" to currentRoute,
            "referrer" to previousRoute,
            "params" to params
        ))
    }
    
    override fun onPageExit(currentRoute: String) {
        // 停留时长统计等
    }
}

技术架构深度解析

编译时代码生成架构

GNav 基于 KSP(Kotlin Symbol Processing)实现编译时代码生成,确保运行时零开销:

@NavPage 注解 → KSP 处理器 → 生成的代码
    ↓               ↓               ↓
Composable函数 → 符号分析 → 路由注册器 + 扩展函数

核心处理流程

  1. ** 符号扫描 ** (NavProcessor
-   扫描所有 `@NavPage`注解的 Composable 函数
-   提取函数签名、参数信息、注解配置
  1. ** 路由构建 ** (RouteBuilder
-   智能路由路径生成
-   参数占位符处理(`{param}`格式)
  1. ** 参数处理 ** (ArgReaderGenerator
-   类型安全的参数解析代码生成
-   支持 String、数值类型、Boolean 等自动转换
  1. ** 扩展函数生成 ** (NavExtensionBuilder
-   生成 `goXxx()`类型安全导航函数
-   自动参数编码和路由拼接

生成的代码示例

** 输入: **

@NavPage
@Composable
fun UserProfilePage(id: Int, tab: String)

** 输出: **

// 自动生成的导航函数
fun NavController.goUserProfile(id: Int, tab: String) {
    navigate("user/${Uri.encode(id.toString())}/profile?tab=${Uri.encode(tab)}")
}

// 自动生成的路由获取函数  
fun getUserProfileRoute(id: Int, tab: String) = 
    "user/${Uri.encode(id.toString())}/profile?tab=${Uri.encode(tab)}"

// 自动注册的路由处理
builder.composable("user/{id}/profile") { backStackEntry ->
    val id = backStackEntry.arguments?.getString("id")?.toIntOrNull() ?: 0
    val tab = backStackEntry.arguments?.getString("tab") ?: "info"
    UserProfilePage(id, tab)
}

模块化架构设计

GNav 采用清晰的模块化架构,确保各组件职责单一:

模块 职责 核心组件
** nav-api ** 接口定义 NavRouteRegistrar, GNavInterceptor, NavAnalytics
** nav-annotations ** 注解定义 @NavPage
** nav-processor ** 代码生成 NavProcessor, RouteBuilder
** nav ** 运行时实现 GNavCompose, GNav

与传统方案对比

特性 Jetpack Navigation GNav
** 路由注册 ** 手动编写,容易遗漏 ✅ 自动注册,零配置
** 参数安全 ** 运行时字符串解析 ✅ 编译时类型检查
** 导航调用 ** 需要传递 NavController ✅ 全局导航 API
** 拦截器 ** 需要手动实现 ✅ 声明式配置
** 类型安全 ** 手动保证 ✅ 自动生成类型安全函数
** 可维护性 ** 分散的配置代码 ✅ 集中式注解管理

最佳实践

路由命名规范

// ✅ 推荐:清晰的命名空间
@NavPage
@Composable fun HomePage()

@NavPage
@Composable fun UserProfilePage()

// ❌ 避免:模糊的路由命名
@NavPage
@Composable fun SomePage123()

参数设计原则

// ✅ 推荐:必要参数 + 可选参数
@NavPage
@Composable
fun OrderDetailPage(
    orderId: String,          // 必要参数
    from: String? = null      // 可选参数
)

// ❌ 暂不支持对象传递,如果需要对象传递,推荐使用 Gson
@NavPage
@Composable fun ComplexPage(
    userInfo:UserInfo
)

拦截器组合使用

// 业务特定的拦截器组合
@NavPage(interceptors = [
    AuthInterceptor::class,      // 认证检查
    PermissionInterceptor::class, // 权限验证  
    AnalyticsInterceptor::class   // 埋点统计
])
@Composable 
fun PaymentPage()

适用场景-单 Activity

🏢 企业级应用

  • 需要严格权限控制的金融、医疗应用
  • 需要完整用户行为追踪的电商平台
  • 复杂的多模块导航架构

🚀 初创项目

  • 快速原型开发,专注业务逻辑
  • 需要高质量代码基础的技术选型
  • 预期会有复杂导航需求的成长型项目

🔧 现有项目迁移

  • 渐进式迁移,与现有 Navigation 兼容
  • 局部模块试点,降低迁移风险
  • 享受自动化带来的开发效率提升

总结

GNav 通过创新的编译时代码生成技术,为 Jetpack Compose 导航提供了企业级的解决方案。它不仅大幅提升了开发效率,更重要的是通过类型安全和自动化机制,从根本上提升了代码质量和可维护性。 无论是从零开始的新项目,还是现有项目的技术升级,GNav 都能为您提供专业、可靠的导航架构支持。 ** 开始体验: ** GNav GitHub Repository


GNav - 让导航变得简单而强大

About

[zh]GNav 路由框架,自动注册,自动生成 goXXX 拓展函数,自动生成 getXXXRoute 函数,支持拦截器 [en]GNav routing framework, automatic registration, automatic generation of goXXX extension functions, automatic generation of getXXXRoute functions, support for interceptors

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •  

Languages