
到目前为止,你已经可以:
但是一个真正的 App 必须有 多页面切换:
在 Flutter 中,页面跳转就是 Navigator 的工作。
一句话理解:
Navigator = 页面栈管理器
就像浏览器的历史记录:
📌 Flutter 的每个页面都是 Widget(通常是 Scaffold)。
假设我们有两个页面:
class FirstPage extends StatelessWidget{
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('第一页')),
body: Center(
child: ElevatedButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondPage()),
);
},
child: Text('跳转到第二页'),
),
),
);
}
}
class SecondPage extends StatelessWidget{
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('第二页')),
body: Center(
child: Text('这是第二页'),
),
);
}
}
📌 点击按钮后,第二页会 覆盖在第一页上。
在第二页,我们可以这样返回:
ElevatedButton(
onPressed: () {
Navigator.pop(context);
},
child: Text('返回上一页'),
)
📌 pop 的本质:
将当前页面从页面栈移除,显示上一页
很多场景需要把数据传给下一页:
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => SecondPage(title: 'Hello Flutter'),
),
);
在第二页接收:
class SecondPage extends StatelessWidget {
final String title;
SecondPage({required this.title});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text(title)),
);
}
}
📌 注意:用 构造函数 传参数是最常用的方式。
Flutter 支持返回数据给上一页:
// 第一页
final result = await Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondPage()),
);
print('返回结果:$result');
// 第二页
ElevatedButton(
onPressed: () {
Navigator.pop(context, '我是返回值');
},
child: Text('返回并传值'),
)
📌 这就是 异步返回机制。
当页面很多时,推荐使用命名路由:
void main() {
runApp(MaterialApp(
initialRoute: '/',
routes: {
'/': (context) => FirstPage(),
'/second': (context) => SecondPage(),
},
));
}
跳转:
Navigator.pushNamed(context, '/second');
📌 命名路由适合中大型项目。
❌ Navigator.push 没传 context ❌ pop 传 null 导致异步错误 ❌ 页面参数忘记加 required ❌ 重复创建 MaterialPageRoute
你已经学会:
📌 到这里为止:
你已经可以开发“多页面 App”了 🚀
Navigator 管页面栈 push 进栈 → 新页面 pop 出栈 → 返回
《Flutter 零基础入门(三十五):异步基础 Future / async / await —— 网络请求与延时操作》
下一篇我们将学习:
🚀 真正开始“业务数据交互”