马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
在 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 {
- @override
- Widget build(BuildContext context) {
- return MaterialApp(
- home: HomePage(),
- );
- }
- }
- // 主页
- class HomePage 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: ElevatedButton(
- onPressed: () {
- // 返回上一页
- Navigator.pop(context);
- },
- child: Text('返回主页'),
- ),
- ),
- );
- }
- }
复制代码 运行结果:
- 启动应用后,表现的是 HomePage。
- 点击按钮后,跳转到 SecondPage。
- 在 SecondPage 中点击按钮,返回到 HomePage。
三、带参数的页面跳转
偶然你需要在页面之间转达数据。可以通过构造函数将参数转达给目的页面。
示例代码:
- // 主页
- class HomePage 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(message: '来自主页的消息'),
- ),
- );
- },
- child: Text('跳转到第二页'),
- ),
- ),
- );
- }
- }
- // 第二页
- class SecondPage extends StatelessWidget {
- final String message;
- SecondPage({required this.message});
- @override
- 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 {
- @override
- 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 {
- @override
- 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 {
- @override
- Widget build(BuildContext context) {
- return MaterialApp(
- initialRoute: '/',
- routes: {
- '/': (context) => HomePage(),
- '/second': (context) => SecondPage(),
- },
- );
- }
- }
- // 主页
- class HomePage extends StatelessWidget {
- @override
- 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 {
- @override
- 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 捕获返回值。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |