Skip to content

结果回传与通信

介绍

导航模块支持“返回上一页并携带结果”。

当前实现基于:

  • NavigationResultKey<T>:结果类型 Key。
  • popBackStackWithResult(...):发送结果并返回。
  • resultEvents(...):监听结果流。

这套机制适合刷新列表、回填表单、选择器回传等场景。

公共结果类型

公共结果定义在: app/src/main/java/com/joker/kit/core/navigation/NavigationResult.kt

kotlin
data class RefreshResult(
    val refresh: Boolean? = null,
)

公共 Key 定义在: app/src/main/java/com/joker/kit/core/navigation/RefreshResultKey.kt

kotlin
object RefreshResultKey : NavigationResultKey<RefreshResult>

自定义 ResultKey 示例

Demo 模块示例: app/src/main/java/com/joker/kit/core/navigation/demo/DemoResultKey.kt

kotlin
object DemoResultKey : NavigationResultKey<DemoResult> {
    override fun serialize(value: DemoResult): Any = Json.encodeToString(value)
    override fun deserialize(raw: Any): DemoResult = Json.decodeFromString(raw as String)
}

说明:

  • 基础类型可直接使用默认实现。
  • 复杂对象建议重写 serialize/deserialize(如 JSON 字符串),保证跨边界稳定。

发送结果

在子页面 ViewModel 中调用:

kotlin
fun sendResultAndBack() {
    popBackStackWithResult(
        DemoResultKey,
        DemoResult(id = 9527, message = "这是回传的结果")
    )
}

该方法会:

  1. 发送结果事件。
  2. 回退到上一页。

接收结果

在父页面 ViewModel 中监听结果流:

kotlin
private fun observeDemoResult() {
    viewModelScope.launch {
        resultEvents(DemoResultKey).collect { result ->
            onResultReceived(result)
        }
    }
}

推荐在 init 中注册一次监听。

刷新场景(通用)

网络基类已经封装刷新监听:

  • BaseNetWorkViewModel.observeRefreshState(...)
  • BaseNetWorkListViewModel.observeRefreshState(...)

当接收到 RefreshResult(refresh = true) 时,会自动触发刷新请求。

示例:

kotlin
popBackStackWithResult(
    RefreshResultKey,
    RefreshResult(refresh = true)
)

注意事项

  • 结果对象尽量轻量,避免传递大对象。
  • 一个业务语义对应一个独立 ResultKey,不要混用。
  • 监听结果时注意生命周期,避免重复 collect。
  • 如果只需要“是否刷新”,优先使用 RefreshResultKey

小结

结果回传推荐模式:

  1. 在导航模块定义 ResultKey 与结果模型。
  2. 子页面调用 popBackStackWithResult 返回。
  3. 父页面通过 resultEvents 监听并更新状态。

这样可以保持通信类型安全,并避免页面间硬编码耦合。