Flutter | 路由管理

发布时间 - 2025-07-19 00:00:00    点击率:

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

什么是路由?

在 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();
  }));
},

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 方法中,异步执行这个函数,最终将返回值打印出来。

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

打印的结果:

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;
    // 如果访问的路由页需要登录,但当前未登录,则直接返回登录页路由,
    // 引导用户登录;其它情况则正常打开路由。
  });
});

参考资料:


# ai  # red  # NULL  # 回调函数  # 继承  # 接口  #   # map  # 对象  # 事件  # 异步  # ios  # flutter  # 是一个  # 我是  # 路由表  # 跳转  # 返回值  # 可以通过  # 自定义  # 创建一个  # 回调  # 的是 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何快速上传建站程序避免常见错误?  如何用AWS免费套餐快速搭建高效网站?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  如何用狗爹虚拟主机快速搭建网站?  详解Oracle修改字段类型方法总结  高性价比服务器租赁——企业级配置与24小时运维服务  如何在腾讯云服务器快速搭建个人网站?  深圳网站制作平台,深圳市做网站好的公司有哪些?  网站优化排名时,需要考虑哪些问题呢?  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  米侠浏览器网页背景异常怎么办 米侠显示修复  如何在自有机房高效搭建专业网站?  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  在centOS 7安装mysql 5.7的详细教程  在Oracle关闭情况下如何修改spfile的参数  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  php 三元运算符实例详细介绍  Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  Laravel如何发送系统通知?(Notification渠道示例)  三星网站视频制作教程下载,三星w23网页如何全屏?  如何获取上海专业网站定制建站电话?  简单实现jsp分页  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  Laravel中的withCount方法怎么高效统计关联模型数量  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  Laravel用户密码怎么加密_Laravel Hash门面使用教程  android nfc常用标签读取总结  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  javascript中闭包概念与用法深入理解  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  C++时间戳转换成日期时间的步骤和示例代码  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  企业网站制作这些问题要关注  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  微信推文制作网站有哪些,怎么做微信推文,急?  桂林网站制作公司有哪些,桂林马拉松怎么报名?