# 订单列表生命周期修复操作日志 操作时间:2026-09-05 操作类型:修改 影响模块:用户端订单、退款、工单、合同及钱包流水列表 ## 操作前状态 - 订单页在每次 `build()` 时创建四个新的列表 ViewModel。 - 列表 State 仍监听旧对象,新对象未加载,旧异步请求可能在页面销毁后继续回调。 - 用户连续刷新时,较早请求可能覆盖较新请求的数据。 - 退款原因输入控制器在对话框退出动画结束前被释放,可能触发红屏。 - 退款提交成功后,订单和退款列表不会同步刷新。 ## 具体操作 - 将 ViewModel 的创建、首次加载和释放统一收归 `RecordListPage` State。 - 通过稳定 `sourceKey` 识别数据源,通过 `refreshToken` 接收外部刷新命令。 - 为四个订单标签增加稳定 Key 和 keep-alive,保留数据、错误状态及滚动位置。 - ViewModel 增加请求代次和销毁保护,仅最后一次请求可更新状态。 - 退款成功后刷新对应订单列表及退款列表。 - 将退款输入控制器移入独立有状态对话框,随对话框生命周期安全释放。 - 合同和钱包流水改用相同的公共列表生命周期契约。 ## 代码变更 - `apps/user_app/lib/ui/features/shared/record_list_view_model.dart`:增加请求竞争和销毁保护。 - `apps/user_app/lib/ui/features/shared/record_list_page.dart`:统一 ViewModel 所有权并支持稳定刷新。 - `apps/user_app/lib/ui/features/orders/orders_page.dart`:稳定四个标签并联动退款刷新。 - `apps/user_app/lib/app/router.dart`:迁移合同和钱包列表调用方式。 - `apps/user_app/test/ui/record_list_view_model_test.dart`:覆盖旧请求和销毁边界。 - `apps/user_app/test/ui/record_list_page_test.dart`:覆盖父组件重建及显式刷新。 - `apps/user_app/test/ui/orders_page_test.dart`:覆盖退款成功后的跨列表刷新和红屏回归。 ## 验证结果 - `flutter analyze`:通过,无静态分析问题。 - 三组新增定向测试共 4 项全部通过。 - `flutter test`:完整 33 项测试全部通过。 - 用户端 Release Web 构建成功,本地静态服务 `http://127.0.0.1:5180/` 返回 HTTP 200。 - 本地后端 `12426` 健康检查返回 HTTP 200。 ## 风险评估 - 仅修改用户端内部组件接口,所有仓库内调用点已同步迁移。 - HTTP 请求本身不强制取消,过期结果会被忽略,不再更新已销毁页面。 - 支付发起后不提前假定支付成功,保持既有业务语义。