Skip to content

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. 观察步骤 ​

  1. 点击「打开详情页选择结果」
  2. 详情页显示传入的 title 与 id
  3. 点击「携带结果返回」
  4. 首页展示「上次返回结果: detail-result-42」
  5. 再次进入详情后直接系统返回:首页结果应保持不变

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. 对应知识库文档 ​

7. 关键源码 ​

站点构建时间:2026/8/24 23:43:17