0

0

Flutter | 路由管理

絕刀狂花

絕刀狂花

发布时间:2025-07-19 10:56:01

|

629人浏览过

|

来源于php中文网

原创

在 flutter 应用中,路由管理是导航到不同页面的关键机制。本文将探讨如何创建和使用新路由,展示如何通过文本按钮进行页面跳转,并介绍 materialpageroute 的功能和 navigator 的用法。

Flutter | 路由管理

什么是路由?

在 Flutter 中,路由(Route)指的是一个屏幕或页面。每个路由都由一个 Widget 构建,可以通过 Navigator 进行管理和切换。

示例1:创建一个新的路由,命名 NewRoute

class NewRoute extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("FlutterStudy"),
      ),
      body: Center(
        child: Text(
          "This is new route",
          style: Theme.of(context).textTheme.headline3,
        ),
      ),
    );
  }
}

示例2:创建一个文本按钮,点击进行跳转

child: Text("点击跳转"),
textColor: Colors.red,
onPressed: () {
  //导航到新的路由
  Navigator.push(context, MaterialPageRoute(builder: (context) {
    return NewRoute();
  }));
},

Flutter | 路由管理

MaterialPageRoute

MaterialPageRoute 是 Material 组件库提供的组件,用于实现与平台页面切换动画风格一致的切换动画。MaterialPageRoute 继承自 PageRoute 类,后者是一个抽象类,表示整个屏幕空间的一个模态路由页面。它定义了路由构建及切换时过渡动画的相关接口和属性。如果需要自定义路由切换动画,可以通过继承 PageRoute 来实现。

MaterialPageRoute 的构造方法

MaterialPageRoute({
  required this.builder,
  RouteSettings? settings,
  this.maintainState = true,
  bool fullscreenDialog = false,
})
  • builder 是 WidgetBuilder 类型的回调函数,负责构建路由的具体内容,返回一个 widget。
  • settings 包含路由的配置信息,例如路由名称和是否初始路由等。
  • maintainState 默认为 true,表示当入栈一个新的路由时,原来的路由仍然会保存在内存中。如果想在路由没用的时候释放其所占用的资源,可以设置为 false。
  • fullscreenDialog 表示新的路由是否是一个全屏的模态对话框。在 iOS 中,若此参数为 true,新页面会从底部滑入,而不是水平方向。

Navigator

Navigator 是一个路由管理组件,提供打开和退出路由的方法。它通过栈来管理活动路由集合,通常屏幕显示的页面就是栈顶路由。

打开一个页面

return Navigator.of(context)!.push(route);

将给定的路由入栈(打开页面),返回一个 future 对象,用于接收该路由出栈时返回的数据。

关闭一个页面

Navigator.of(context)!.pop(result);

将栈顶路由出栈,result 为要返回给上一个页面的数据。

路由传值

class TipRoute extends StatelessWidget {
  TipRoute({Key key, this.text}) : super(key: key);
  final String text;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("提示"),
      ),
      body: Padding(
        padding: EdgeInsets.all(18),
        child: Center(
          child: Column(
            children: [
              Text(text),
              RaisedButton(
                onPressed: () => Navigator.pop(context, "我是返回值"),
                child: Text("返回"),
              )
            ],
          ),
        ),
      ),
    );
  }
}

在界面中添加了一个 appbar,中间显示一个文本和一个 RaisedButton,点击后进行 pop 并传入要返回的值。

@override
Widget build(BuildContext context) {
  return Center(
    child: RaisedButton(
      onPressed: () async {
        await Navigator.push(context, MaterialPageRoute(builder: (context) {
          return TipRoute(text: "我是参数");
        })).then((value) => print("路由返回值 $value"));
      },
      child: Text("打开提示页面"),
    ),
  );
}

在 onPressed 方法中,异步执行这个函数,最终将返回值打印出来。

运行上面的代码,点击 "打开提示页面",效果如下所示:

Flutter | 路由管理

WaStar 网上花店系统
WaStar 网上花店系统

系统特点: 商品多级分类检索、搜索,支持同一商品多重分类,自由设置显示式样 自由设置会员类型,自由设置权限项目,自由分配每种会员类型和每个会员的权限 灵活的商品定价,最多12级价格自由分配给各种会员类型或会员,也可针对单会员单商品特殊定价 强大的会员管理、帐户管理、订单管理功能和一系列帐务查询统计功能 灵活的会员积分系统,自由设置每个积分事件的积分计算方法 灵活的网站内容发布、管理系统,每个栏目可

下载

打印的结果:

I/flutter (23778): 路由返回值 我是返回值

需要注意的是:

  1. 参数是通过构造方法传入的。
  2. 如果点击左上角或者返回按钮进行返回,则页面返回的值为 null。

命名路由

命名路由是指给路由起一个名字,通过名字直接打开路由。

路由表

路由表是一个 map,key 为路由名字,value 是一个 builder 的回调函数,用于生成相应的路由 widget。如下:

final Map? routes;

注册路由

在 MaterialApp 里面,添加 routes 属性即可,如下:

return MaterialApp(
  //app name
  title: 'FlutterStudy',
  theme: ThemeData(
    primarySwatch: Colors.red,
  ),
  routes: {
    "new_page": (context) => NewRoute(),
    "/": (context) => MyHomePage(title: "Flutter Study")
  },
  //应用首页路由
  home: MyHomePage(title: 'Flutter Study'),
);

打开路由页面

child: Text("自定义 Button"),
onPressed: () {
  Navigator.pushNamed(context, "router_test");
}

在点击的事件中,跳转到对应的路由页面。

带参数的命名路由传递

在路由表里面注册:

"new_page": (context) => NewRoute(),

接受参数:

@override
Widget build(BuildContext context) {
  var args = ModalRoute.of(context).settings.arguments;
  //......
}

在跳转的时候发送数据即可:

Navigator.pushNamed(context, "new_page", arguments: "Hello World");

路由生成钩子

在打开某些页面时,可能需要做一些权限检测,如用户是否登录,是否需要密码等。如果每次打开路由时都要去判断一下会非常麻烦,这种情况可以通过 MaterialApp 实现。

MaterialApp 有一个 onGenerateRoute 属性,他在打开路由时可能会被调用。之所以说可能,是因为当调用 Navigator.pushNamed() 打开路由时,如果指定的路由在路由表中已经注册,则会调用路由表中的 builder 函数来生成路由组件;如果路由表中没有注册,才会调用 onGenerateRoute 来生成路由。

... //省略无关代码
onGenerateRoute:(RouteSettings settings){
  return MaterialPageRoute(builder: (context){
    String routeName = settings.name;
    // 如果访问的路由页需要登录,但当前未登录,则直接返回登录页路由,
    // 引导用户登录;其它情况则正常打开路由。
  });
});

参考资料:

相关文章

路由优化大师
路由优化大师

路由优化大师是一款及简单的路由器设置管理软件,其主要功能是一键设置优化路由、屏广告、防蹭网、路由器全面检测及高级设置等,有需要的小伙伴快来保存下载体验吧!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

231

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

436

2024.03.01

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1023

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

66

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

429

2025.12.29

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

391

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

572

2023.08.10

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

75

2025.09.05

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

68

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

Flutter开发基础教程_微信克隆
Flutter开发基础教程_微信克隆

共25课时 | 2.7万人学习

Dart Flutter2入门实战视频教程
Dart Flutter2入门实战视频教程

共47课时 | 6.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号