基础父类
app/src/main/java/com/joker/kit/core/base/viewmodel/BaseViewModel.kt 是所有 Feature ViewModel 的根基类,目前仅作为 ViewModel 的空壳抽象层,为后续统一扩展预留入口。网络请求相关的 BaseNetWorkViewModel 与分页列表相关的 BaseNetWorkListViewModel 均直接继承自该类。
核心职责
- 统一继承入口:所有业务 ViewModel 均继承
BaseViewModel,保证类型一致,便于后续在基类中增加公共能力(如日志、生命周期埋点等)而不改动业务代码。 - 与导航解耦:导航能力已从
BaseViewModel中剥离,改为通过AppNavigator注入或全局导航函数直接使用,避免基类过度膨胀。
导航方式的变化
旧版 BaseViewModel 将导航方法(navigate、navigateBack、popBackStackWithResult 等)直接封装在基类中,需要传入 AppNavigator、UserState、RouteInterceptor。
当前版本将导航能力拆分为两层:
| 使用场景 | 方式 | 说明 |
|---|---|---|
| ViewModel 内跳转 | 注入 AppNavigator | 通过 Hilt 注入单例,调用 navigateTo、navigateBack 等方法 |
| Composable / 全局 | 调用全局导航函数 | navigate()、navigateBack()、popBackStackWithResult() 等顶层扩展函数 |
全局导航函数由 NavigationService 统一维护,内部自动处理导航器绑定与登录拦截,业务层无需关注底层细节。
使用示例
ViewModel 中注入导航
kotlin
@HiltViewModel
class GoodsDetailViewModel @Inject constructor(
private val navigator: AppNavigator,
private val repository: GoodsRepository,
) : BaseNetWorkViewModel<GoodsDetail>() {
fun openCart() {
navigator.navigateTo(OrderRoutes.Cart)
}
fun finishWithResult(goodId: Long) {
navigator.popBackStackWithResult(RefreshGoodsKey, goodId)
}
}Composable 中直接导航
kotlin
@Composable
fun SomeScreen() {
Button(onClick = { navigateBack() }) {
Text("返回")
}
}API 参考
BaseViewModel
| 名称 | 类型 | 说明 |
|---|---|---|
BaseViewModel | 抽象类 | 继承自 androidx.lifecycle.ViewModel,所有业务 ViewModel 的根基类 |
全局导航扩展函数
| 函数 | 参数 | 说明 |
|---|---|---|
navigate(route, navOptions) | route: NavKey, navOptions: NavigationOptions? = null | 跳转到目标路由,自动执行登录拦截 |
navigateAndCloseCurrent(route, currentRoute) | route: NavKey, currentRoute: NavKey | 跳转并关闭当前页面 |
navigateBack() | - | 返回上一页 |
navigateBackTo(route, inclusive) | route: NavKey, inclusive: Boolean = false | 回退到指定路由 |
popBackStackWithResult(key, result) | key: NavigationResultKey<T>, result: T | 携带类型安全结果返回 |
resultEvents(key) | key: NavigationResultKey<T> | 监听指定 Key 的结果流 |
AppNavigator
| 方法 | 说明 |
|---|---|
navigateTo(route, navOptions) | 类型安全路由跳转 |
navigateBack() | 返回上一页 |
navigateBackTo(route, inclusive) | 回退到指定路由 |
popBackStackWithResult(key, result) | 携带结果返回 |
resultEvents(key) | 监听结果流 |