Skip to content

基础父类

app/src/main/java/com/joker/kit/core/base/viewmodel/BaseViewModel.kt 提供了所有 Feature ViewModel 共享的导航基类,实现类型安全的路由跳转、登录拦截及结果回传能力。只要继承该类并注入 AppNavigatorUserState(以及可选的 RouteInterceptor),业务 ViewModel 就可以专注于状态管理,不再重复编写导航样板代码。

核心职责

  • 统一导航入口navigate/navigateAndCloseCurrent 将任意 @Serializable 路由对象发送给 AppNavigator,同时在内部触发登录拦截。
  • 返回控制navigateBack/navigateBackTo 封装了回退到上一页或某个特定路由的常见场景。
  • 类型安全的结果传递popBackStackWithResult 结合 NavigationResultKey<T>,在编译期即可约束返回值的类型,避免字符串 key 带来的错误。
  • 登录拦截checkRouteInterception 会利用 RouteInterceptor 判断目标路由是否需要登录,若未登录则自动替换为登录页路由。

常用方法

方法作用关键点
navigate(route, navOptions)跳转到目标路由路由对象可以附带参数,NavOptions 可选
navigateAndCloseCurrent(route, currentRoute)跳转并关闭当前页面内部构建 NavOptionssetPopUpTo 逻辑
navigateBack()返回上一页委托 AppNavigator.navigateBack()
navigateBackTo(route, inclusive)回退到指定路由inclusive=true 时连同目标一起关闭
popBackStackWithResult(key, result)携带结果回退NavigationResultKey<T> 让返回值类型受约束

所有方法都运行在 viewModelScope.launch { ... } 中,无需在业务代码里额外处理协程。

使用示例

kotlin
@HiltViewModel
class GoodsDetailViewModel @Inject constructor(
    navigator: AppNavigator,
    userState: UserState
) : BaseViewModel(navigator, userState) {

    fun openCart() {
        navigate(OrderRoutes.Cart)
    }

    fun finishWithResult(goodId: Long) {
        popBackStackWithResult(RefreshGoodsKey, goodId)
    }
}

得益于 BaseViewModel 提供的封装,项目中的任意 ViewModel 只需要按需调用这些方法,即可获得一致、类型安全、可拦截的导航体验。

API 参考

BaseViewModel

名称类型默认值说明
navigatorAppNavigator-类型安全导航控制器,protected 属性
userStateUserState-全局用户状态,protected 属性
routeInterceptorRouteInterceptorRouteInterceptor()可自定义登录拦截规则
navigate(route, navOptions)函数navOptions = null跳转到任意 @Serializable 路由,自动执行拦截
navigateAndCloseCurrent(route, currentRoute)函数-跳转新页并通过 NavOptions.setPopUpTo 关闭当前页
navigateBack()函数-调用 AppNavigator.navigateBack() 返回上一页
navigateBackTo(route, inclusive)函数inclusive = false回退到特定路由,可选择是否包含目标页
popBackStackWithResult(key, result)函数-携带类型安全结果返回,配合 NavigationResultKey<T>