在 Flutter 中Navigator.push 用于实现页面之间的导航

打印 上一主题 下一主题

主题 1814|帖子 1814|积分 5442

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在 Flutter 中,Navigator.push 是一个非常紧张的方法,用于实现页面之间的导航。通过 Navigator.push,你可以将一个新的页面(路由)推送到导航栈中,从而表现新的内容。
以下是一个详细的教程,帮助你理解如何利用 Navigator.push 举行页面跳转。

一、根本用法

Navigator.push 的根本语法如下:
  1. Navigator.push(
  2.   context,
  3.   MaterialPageRoute(builder: (context) => TargetPage()),
  4. );
复制代码
参数说明:


  • context:当前的 BuildContext,通常是从 StatelessWidget 或 StatefulWidget 的 build 方法中获取。
  • MaterialPageRoute:界说了一个页面路由,builder 属性用于指定目的页面的内容。

二、完整示例

以下是一个完整的示例,演示如何从主页跳转到另一个页面。
示例代码:

  1. import 'package:flutter/material.dart';
  2. void main() {
  3.   runApp(MyApp());
  4. }
  5. class MyApp extends StatelessWidget {
  6.   @override
  7.   Widget build(BuildContext context) {
  8.     return MaterialApp(
  9.       home: HomePage(),
  10.     );
  11.   }
  12. }
  13. // 主页
  14. class HomePage extends StatelessWidget {
  15.   @override
  16.   Widget build(BuildContext context) {
  17.     return Scaffold(
  18.       appBar: AppBar(title: Text('主页')),
  19.       body: Center(
  20.         child: ElevatedButton(
  21.           onPressed: () {
  22.             // 跳转到新页面
  23.             Navigator.push(
  24.               context,
  25.               MaterialPageRoute(builder: (context) => SecondPage()),
  26.             );
  27.           },
  28.           child: Text('跳转到第二页'),
  29.         ),
  30.       ),
  31.     );
  32.   }
  33. }
  34. // 第二页
  35. class SecondPage extends StatelessWidget {
  36.   @override
  37.   Widget build(BuildContext context) {
  38.     return Scaffold(
  39.       appBar: AppBar(title: Text('第二页')),
  40.       body: Center(
  41.         child: ElevatedButton(
  42.           onPressed: () {
  43.             // 返回上一页
  44.             Navigator.pop(context);
  45.           },
  46.           child: Text('返回主页'),
  47.         ),
  48.       ),
  49.     );
  50.   }
  51. }
复制代码
运行结果:


  • 启动应用后,表现的是 HomePage。
  • 点击按钮后,跳转到 SecondPage。
  • 在 SecondPage 中点击按钮,返回到 HomePage。

三、带参数的页面跳转

偶然你需要在页面之间转达数据。可以通过构造函数将参数转达给目的页面。
示例代码:

  1. // 主页
  2. class HomePage extends StatelessWidget {
  3.   @override
  4.   Widget build(BuildContext context) {
  5.     return Scaffold(
  6.       appBar: AppBar(title: Text('主页')),
  7.       body: Center(
  8.         child: ElevatedButton(
  9.           onPressed: () {
  10.             // 跳转到新页面,并传递参数
  11.             Navigator.push(
  12.               context,
  13.               MaterialPageRoute(
  14.                 builder: (context) => SecondPage(message: '来自主页的消息'),
  15.               ),
  16.             );
  17.           },
  18.           child: Text('跳转到第二页'),
  19.         ),
  20.       ),
  21.     );
  22.   }
  23. }
  24. // 第二页
  25. class SecondPage extends StatelessWidget {
  26.   final String message;
  27.   SecondPage({required this.message});
  28.   @override
  29.   Widget build(BuildContext context) {
  30.     return Scaffold(
  31.       appBar: AppBar(title: Text('第二页')),
  32.       body: Center(
  33.         child: Column(
  34.           mainAxisAlignment: MainAxisAlignment.center,
  35.           children: [
  36.             Text('收到的消息:$message'),
  37.             ElevatedButton(
  38.               onPressed: () {
  39.                 // 返回上一页
  40.                 Navigator.pop(context);
  41.               },
  42.               child: Text('返回主页'),
  43.             ),
  44.           ],
  45.         ),
  46.       ),
  47.     );
  48.   }
  49. }
复制代码
说明:


  • 在 SecondPage 的构造函数中界说了一个 message 参数。
  • 利用 Navigator.push 跳转时,通过构造函数转达参数。
  • 在目的页面中,直接利用转达的参数即可。

四、返回值的页面跳转

偶然你可能需要从目的页面返回一些数据。可以利用 Navigator.push 的返回值来实现。
示例代码:

  1. // 主页
  2. class HomePage extends StatelessWidget {
  3.   @override
  4.   Widget build(BuildContext context) {
  5.     return Scaffold(
  6.       appBar: AppBar(title: Text('主页')),
  7.       body: Center(
  8.         child: ElevatedButton(
  9.           onPressed: () async {
  10.             // 跳转到新页面并等待返回值
  11.             final result = await Navigator.push(
  12.               context,
  13.               MaterialPageRoute(
  14.                 builder: (context) => SecondPage(),
  15.               ),
  16.             );
  17.             // 显示返回值
  18.             ScaffoldMessenger.of(context).showSnackBar(
  19.               SnackBar(content: Text('返回值:$result')),
  20.             );
  21.           },
  22.           child: Text('跳转到第二页'),
  23.         ),
  24.       ),
  25.     );
  26.   }
  27. }
  28. // 第二页
  29. class SecondPage extends StatelessWidget {
  30.   @override
  31.   Widget build(BuildContext context) {
  32.     return Scaffold(
  33.       appBar: AppBar(title: Text('第二页')),
  34.       body: Center(
  35.         child: Column(
  36.           mainAxisAlignment: MainAxisAlignment.center,
  37.           children: [
  38.             ElevatedButton(
  39.               onPressed: () {
  40.                 // 返回数据
  41.                 Navigator.pop(context, '这是从第二页返回的数据');
  42.               },
  43.               child: Text('返回数据'),
  44.             ),
  45.           ],
  46.         ),
  47.       ),
  48.     );
  49.   }
  50. }
复制代码
说明:


  • 利用 await Navigator.push 捕获目的页面返回的数据。
  • 在目的页面中,通过 Navigator.pop(context, data) 返回数据。
  • 在主页中,吸收到返回值后,可以通过 SnackBar 或其他方式展示。

五、命名路由(Navigator.pushNamed)

除了动态创建路由外,Flutter 还支持命名路由。这种方式更适用于大型项目,由于可以集中管理路由。
示例代码:

  1. import 'package:flutter/material.dart';
  2. void main() {
  3.   runApp(MyApp());
  4. }
  5. class MyApp extends StatelessWidget {
  6.   @override
  7.   Widget build(BuildContext context) {
  8.     return MaterialApp(
  9.       initialRoute: '/',
  10.       routes: {
  11.         '/': (context) => HomePage(),
  12.         '/second': (context) => SecondPage(),
  13.       },
  14.     );
  15.   }
  16. }
  17. // 主页
  18. class HomePage extends StatelessWidget {
  19.   @override
  20.   Widget build(BuildContext context) {
  21.     return Scaffold(
  22.       appBar: AppBar(title: Text('主页')),
  23.       body: Center(
  24.         child: ElevatedButton(
  25.           onPressed: () {
  26.             // 使用命名路由跳转
  27.             Navigator.pushNamed(context, '/second');
  28.           },
  29.           child: Text('跳转到第二页'),
  30.         ),
  31.       ),
  32.     );
  33.   }
  34. }
  35. // 第二页
  36. class SecondPage extends StatelessWidget {
  37.   @override
  38.   Widget build(BuildContext context) {
  39.     return Scaffold(
  40.       appBar: AppBar(title: Text('第二页')),
  41.       body: Center(
  42.         child: ElevatedButton(
  43.           onPressed: () {
  44.             // 返回上一页
  45.             Navigator.pop(context);
  46.           },
  47.           child: Text('返回主页'),
  48.         ),
  49.       ),
  50.     );
  51.   }
  52. }
复制代码
说明:


  • 在 MaterialApp 中界说了 routes,其中键是路由名称,值是对应的页面构建器。
  • 利用 Navigator.pushNamed 跳转到指定的命名路由。

六、总结



  • Navigator.push:用于动态创建路由并跳转到新页面。
  • Navigator.pushNamed:通过命名路由跳转,适合管理复杂的应用。
  • 转达参数:通过构造函数或 ModalRoute.of(context) 获取参数。
  • 返回值:利用 Navigator.pop 返回数据,并通过 await 捕获返回值。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

去皮卡多

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表