基础父类
app/src/main/java/com/joker/kit/core/base/viewmodel/BaseViewModel.kt 提供了所有 Feature ViewModel 共享的导航基类,实现类型安全的路由跳转、登录拦截及结果回传能力。只要继承该类并注入 AppNavigator、UserState(以及可选的 RouteInterceptor),业务 ViewModel 就可以专注于状态管理,不再重复编写导航样板代码。
核心职责
- 统一导航入口:
navigate/navigateAndCloseCurrent将任意@Serializable路由对象发送给AppNavigator,同时在内部触发登录拦截。 - 返回控制:
navigateBack/navigateBackTo封装了回退到上一页或某个特定路由的常见场景。 - 类型安全的结果传递:
popBackStackWithResult结合NavigationResultKey<T>,在编译期即可约束返回值的类型,避免字符串 key 带来的错误。 - 登录拦截:
checkRouteInterception会利用RouteInterceptor判断目标路由是否需要登录,若未登录则自动替换为登录页路由。
常用方法
| 方法 | 作用 | 关键点 |
|---|---|---|
navigate(route, navOptions) | 跳转到目标路由 | 路由对象可以附带参数,NavOptions 可选 |
navigateAndCloseCurrent(route, currentRoute) | 跳转并关闭当前页面 | 内部构建 NavOptions 的 setPopUpTo 逻辑 |
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
| 名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
navigator | AppNavigator | - | 类型安全导航控制器,protected 属性 |
userState | UserState | - | 全局用户状态,protected 属性 |
routeInterceptor | RouteInterceptor | RouteInterceptor() | 可自定义登录拦截规则 |
navigate(route, navOptions) | 函数 | navOptions = null | 跳转到任意 @Serializable 路由,自动执行拦截 |
navigateAndCloseCurrent(route, currentRoute) | 函数 | - | 跳转新页并通过 NavOptions.setPopUpTo 关闭当前页 |
navigateBack() | 函数 | - | 调用 AppNavigator.navigateBack() 返回上一页 |
navigateBackTo(route, inclusive) | 函数 | inclusive = false | 回退到特定路由,可选择是否包含目标页 |
popBackStackWithResult(key, result) | 函数 | - | 携带类型安全结果返回,配合 NavigationResultKey<T> |