
到目前为止,你已经掌握了:
但是在复杂 App 中,页面跳转与参数传递是必备技能。
Flutter 提供了两种跳转方式:
本篇我们重点学习 命名路由 + 参数传递,更适合大型项目。
在 MaterialApp 中:
MaterialApp(
title: '路由示例',
initialRoute: '/',
routes: {
'/': (context) => HomePage(),
'/detail': (context) => DetailPage(),
},
);
📌 说明:
initialRoute → 初始页面routes → 路由表ElevatedButton(
onPressed: () {
Navigator.pushNamed(context, '/detail');
},
child: Text('跳转到详情页'),
)
📌 跳转方式简洁,方便统一管理页面
Navigator.pushNamed(
context,
'/detail',
arguments: {'id': 1001, 'title': '详情页标题'},
);
在 DetailPage 中:
class DetailPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final args = ModalRoute.of(context)!.settings.arguments as Map;
final id = args['id'];
final title = args['title'];
return Scaffold(
appBar: AppBar(title: Text(title)),
body: Center(
child: Text('接收到参数 id = $id'),
),
);
}
}
📌 ModalRoute.of(context)!.settings.arguments 获取传递参数
ElevatedButton(
onPressed: () {
Navigator.pop(context, '我是返回值');
},
child: Text('返回上一页'),
)
void _openDetail() async {
final result = await Navigator.pushNamed(
context,
'/detail',
arguments: {'id': 1001, 'title': '详情页'},
);
print('返回值: $result');
}
📌 await → 等待页面返回结果 → 接收返回值
class HomePage extends StatelessWidget {
final List<Map> items = List.generate(
10,
(index) => {'id': index, 'title': '条目 $index'},
);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('首页列表')),
body: ListView.builder(
itemCount: items.length,
itemBuilder: (context, index) {
final item = items[index];
return ListTile(
title: Text(item['title']),
onTap: () async {
final result = await Navigator.pushNamed(
context,
'/detail',
arguments: item,
);
if (result != null) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('返回值: $result')),
);
}
},
);
},
),
);
}
}
class DetailPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final args = ModalRoute.of(context)!.settings.arguments as Map;
final id = args['id'];
final title = args['title'];
return Scaffold(
appBar: AppBar(title: Text(title)),
body: Center(
child: ElevatedButton(
onPressed: () {
Navigator.pop(context, '已阅读 id=$id');
},
child: Text('返回并传值'),
),
),
);
}
}
📌 功能总结:
❌ 没配置 routes → pushNamed 找不到路由 ❌ arguments 类型转换错误 → as Map / List / 自定义类型 ❌ 返回值未 await → 无法获取结果 ❌ 命名重复 → 路由冲突
📌 建议:
你已经学会:
📌 到这里为止:
你的 App 页面跳转能力已经接近生产级别 ✅
命名路由统一管理页面 arguments 传参 pop 返回值 + await 接收 多页面跳转轻松实现
《Flutter 零基础入门(四十三):Flutter 动画基础 —— 动态交互与过渡效果》
下一篇我们将学习:
🚀 让你的 App 更加生动有趣