在 Flutter 中,Navigator.push
是一个非常重要的方法,用于实现页面之间的导航。通过 Navigator.push
,你可以将一个新的页面(路由)推送到导航栈中,从而显示新的内容。
以下是一个详细的教程,帮助你理解如何使用 Navigator.push
进行页面跳转。
一、基本用法
Navigator.push
的基本语法如下:
Navigator.push(
context,
MaterialPageRoute(builder: (context) => TargetPage()),
);
参数说明:
context
:当前的BuildContext
,通常是从StatelessWidget
或StatefulWidget
的build
方法中获取。MaterialPageRoute
:定义了一个页面路由,builder
属性用于指定目标页面的内容。
二、完整示例
以下是一个完整的示例,演示如何从主页跳转到另一个页面。
示例代码:
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
home: HomePage(),
);
}
}
// 主页
class HomePage extends StatelessWidget {
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 {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('第二页')),
body: Center(
child: ElevatedButton(
onPressed: () {
// 返回上一页
Navigator.pop(context);
},
child: Text('返回主页'),
),
),
);
}
}
运行效果:
- 启动应用后,显示的是
HomePage
。 - 点击按钮后,跳转到
SecondPage
。 - 在
SecondPage
中点击按钮,返回到HomePage
。
三、带参数的页面跳转
有时你需要在页面之间传递数据。可以通过构造函数将参数传递给目标页面。
示例代码:
// 主页
class HomePage extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('主页')),
body: Center(
child: ElevatedButton(
onPressed: () {
// 跳转到新页面,并传递参数
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => SecondPage(message: '来自主页的消息'),
),
);
},
child: Text('跳转到第二页'),
),
),
);
}
}
// 第二页
class SecondPage extends StatelessWidget {
final String message;
SecondPage({required this.message});
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('第二页')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('收到的消息:$message'),
ElevatedButton(
onPressed: () {
// 返回上一页
Navigator.pop(context);
},
child: Text('返回主页'),
),
],
),
),
);
}
}
说明:
- 在
SecondPage
的构造函数中定义了一个message
参数。 - 使用
Navigator.push
跳转时,通过构造函数传递参数。 - 在目标页面中,直接使用传递的参数即可。
四、返回值的页面跳转
有时你可能需要从目标页面返回一些数据。可以使用 Navigator.push
的返回值来实现。
示例代码:
// 主页
class HomePage extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('主页')),
body: Center(
child: ElevatedButton(
onPressed: () async {
// 跳转到新页面并等待返回值
final result = await Navigator.push(
context,
MaterialPageRoute(
builder: (context) => SecondPage(),
),
);
// 显示返回值
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('返回值:$result')),
);
},
child: Text('跳转到第二页'),
),
),
);
}
}
// 第二页
class SecondPage extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('第二页')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () {
// 返回数据
Navigator.pop(context, '这是从第二页返回的数据');
},
child: Text('返回数据'),
),
],
),
),
);
}
}
说明:
- 使用
await Navigator.push
捕获目标页面返回的数据。 - 在目标页面中,通过
Navigator.pop(context, data)
返回数据。 - 在主页中,接收到返回值后,可以通过
SnackBar
或其他方式展示。
五、命名路由(Navigator.pushNamed
)
除了动态创建路由外,Flutter 还支持命名路由。这种方式更适用于大型项目,因为可以集中管理路由。
示例代码:
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
initialRoute: '/',
routes: {
'/': (context) => HomePage(),
'/second': (context) => SecondPage(),
},
);
}
}
// 主页
class HomePage extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('主页')),
body: Center(
child: ElevatedButton(
onPressed: () {
// 使用命名路由跳转
Navigator.pushNamed(context, '/second');
},
child: Text('跳转到第二页'),
),
),
);
}
}
// 第二页
class SecondPage extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('第二页')),
body: Center(
child: ElevatedButton(
onPressed: () {
// 返回上一页
Navigator.pop(context);
},
child: Text('返回主页'),
),
),
);
}
}
说明:
- 在
MaterialApp
中定义了routes
,其中键是路由名称,值是对应的页面构建器。 - 使用
Navigator.pushNamed
跳转到指定的命名路由。
六、总结
Navigator.push
:用于动态创建路由并跳转到新页面。Navigator.pushNamed
:通过命名路由跳转,适合管理复杂的应用。- 传递参数:通过构造函数或
ModalRoute.of(context)
获取参数。 - 返回值:使用
Navigator.pop
返回数据,并通过await
捕获返回值。