Appearance
page-result-demo
1. 实验目标
聚焦「页面返回结果」事故样板,对照 Navigator.pop(result) 与全局状态污染:
- 父页
pushNamed打开详情,用await接收pop回传值 - 子页
Navigator.pop(context, result)回传,不写入全局 Provider / Riverpod - 父页只更新本页
_lastResult,理解结果作用域边界
2. 对应事故样板
- 为什么地址选择结果不该默认塞进全局单例?
- 一句话答:回传结果是父子页面栈内的一次性契约,父页收到后应落到本页 state;全局化会让无关页面也读到旧选择。
pop(result)和go_router的extra回传有什么区别?- 一句话答:
Navigator.pop(result)是栈内同步回传,适合单任务流;go_router更偏向 URL / 声明式状态,回传仍应在本页消费,不应默认升级成全局路由状态。
- 一句话答:
3. 运行方式
bash
cd labs/flutter/host
flutter run -d macos
# 或切到 ios / android启动后在 host 首页进入 Page Result Demo(由 app_router 接线后可见)。
4. 观察步骤
- 点击「打开详情页选择结果」
- 详情页显示传入的 title 与 id
- 点击「携带结果返回」
- 首页展示「上次返回结果: detail-result-42」
- 再次进入详情后直接系统返回:首页结果应保持不变
5. 关键实现速览
5.1 父页 await 回传结果
dart
final result = await Navigator.of(context).pushNamed(
PageResultDemoPage.detailRouteName,
arguments: PageResultDetailArgs(id: 42, title: '订单详情'),
);
if (!mounted) return;
setState(() => _lastResult = '$result');这段代码说明:回传结果只在父页 state 消费,不写入全局仓库。
完整源码:page_result_demo_page.dart
5.2 子页 pop 回传
dart
onPressed: () => Navigator.of(context).pop('detail-result-${args.id}'),这段代码说明:pop 的第二个参数就是回传值,生命周期随路由出栈结束。
完整源码:page_result_demo_page.dart
6. 对应知识库文档
- 理论主文档:Flutter 路由:go_router / Navigator 体系
- 状态分层总览:状态管理、路由、架构