结果回传与通信
介绍
导航模块支持“返回上一页并携带结果”。
当前实现基于:
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 = "这是回传的结果")
)
}该方法会:
- 发送结果事件。
- 回退到上一页。
接收结果
在父页面 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。
小结
结果回传推荐模式:
- 在导航模块定义
ResultKey与结果模型。 - 子页面调用
popBackStackWithResult返回。 - 父页面通过
resultEvents监听并更新状态。
这样可以保持通信类型安全,并避免页面间硬编码耦合。