Skip to content

基础父类

app/src/main/java/com/joker/kit/core/base/viewmodel/BaseViewModel.kt 是所有 Feature ViewModel 的根基类,目前仅作为 ViewModel 的空壳抽象层,为后续统一扩展预留入口。网络请求相关的 BaseNetWorkViewModel 与分页列表相关的 BaseNetWorkListViewModel 均直接继承自该类。

核心职责

  • 统一继承入口:所有业务 ViewModel 均继承 BaseViewModel,保证类型一致,便于后续在基类中增加公共能力(如日志、生命周期埋点等)而不改动业务代码。
  • 与导航解耦:导航能力已从 BaseViewModel 中剥离,改为通过 AppNavigator 注入或全局导航函数直接使用,避免基类过度膨胀。

导航方式的变化

旧版 BaseViewModel 将导航方法(navigatenavigateBackpopBackStackWithResult 等)直接封装在基类中,需要传入 AppNavigatorUserStateRouteInterceptor

当前版本将导航能力拆分为两层:

使用场景方式说明
ViewModel 内跳转注入 AppNavigator通过 Hilt 注入单例,调用 navigateTonavigateBack 等方法
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)监听结果流