在移动开发中页面跳转也被称为导航管理,也就是路由,在Flutter中是如何实现的呢

import 'package:flutter/material.dart';///页面跳转
void main() => runApp(new FirstPage());class FirstPage extends StatefulWidget {@override_FirstPageState createState() => new _FirstPageState();
}class _FirstPageState extends State<FirstPage> {@overrideWidget build(BuildContext context) {return new MaterialApp(title: "第一个页面",home: Scaffold(appBar: AppBar(title: Text("第一个页面"),),body: RaisedButton(onPressed: () {///路由跳转Navigator.push(context, MaterialPageRoute(builder: (_) {return new SecondPage();}));}, child: Text("点击跳转第二个页面"),),),);}
}class SecondPage extends StatelessWidget {@overrideWidget build(BuildContext context) {return new MaterialApp(title: "第二个页面",home: Scaffold(body: Text("第二个页面"),),);}
}

按照上面的代码执行跳转会打印如下错误

以上错误出现在Navigator上

  • 第一种解决方式

context传入MaterialApp下的context即可,代码如下

import 'package:flutter/material.dart';///页面跳转
void main() => runApp(new FirstPage());class FirstPage extends StatefulWidget {@override_FirstPageState createState() => new _FirstPageState();
}class _FirstPageState extends State<FirstPage> {@overrideWidget build(BuildContext context) {return new MaterialApp(title: "第一个页面",home: Builder(builder: buildScaffold), //Builder添加后才能跳转成功); //MaterialApp}
}///创建一个widget
Widget buildScaffold(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("第一个页面"),),body: RaisedButton(onPressed: () {Navigator.push(context, MaterialPageRoute(builder: (_) {return new SecondPage();}));}, child: Text("点击跳转第二个页面"),),); //Scaffo
}class SecondPage extends StatelessWidget {@overrideWidget build(BuildContext context) {///无需指定MaterialApp,使用的是第一个页面的风格,可指定AppBarreturn Scaffold(appBar: AppBar(title: Text("第二个页面"),),body: Text("第二个页面"),);}
}
  • 第二种方式
    采用分离的方式,代码如下
import 'package:flutter/material.dart';void main() => runApp(new PageOne());class PageOne extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: "页面一",home: new PageOneDetail(),);}
}class PageOneDetail extends StatelessWidget {///此处context为MaterialApp下的context@overrideWidget build(BuildContext context) {return new Scaffold(appBar: AppBar(title: Text("第一个页面"),),body: RaisedButton(onPressed: () {Navigator.push(context, MaterialPageRoute(builder: (_) {return PageTwo();}));}, child: Text("点我跳转"),),);}
}class PageTwo extends StatelessWidget {@overrideWidget build(BuildContext context) {return new Scaffold(appBar: AppBar(title: Text("第二个页面"),),body: Text("我是第二个页面"),);}
}
  • 第三种采用命名路由的方法
import 'package:flutter/material.dart';void main() => runApp(new PageOne());class PageOne extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: "页面一",home: new PageOneDetail(),///注册路由表routes: {/// '/'是特殊地址,第一个页面"/": (context) => PageOne(),"/pageTwo": (context) => PageTwo(),},);}
}class PageOneDetail extends StatelessWidget {///此处context为MaterialApp下的context@overrideWidget build(BuildContext context) {return new Scaffold(appBar: AppBar(title: Text("第一个页面"),),body: RaisedButton(onPressed: () {Navigator.pushNamed(context, "/pageTwo");}, child: Text("点我跳转"),),);}
}class PageTwo extends StatelessWidget {@overrideWidget build(BuildContext context) {return new Scaffold(appBar: AppBar(title: Text("第二个页面"),),body: RaisedButton(onPressed: () {//路由pop弹出Navigator.pop(context, "结束");}, child: Text("我是第二个页面"),));}
}

上面的代码会报下面的错误

改成下面的代码即可

import 'package:flutter/material.dart';void main() => runApp(new PageOne());class PageOne extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: "页面一",///该处需要去掉下面已经指定了第一个页面
//      home: new PageOneDetail(),///注册路由表routes: {/// '/'是特殊地址,第一个页面"/": (context) => PageOneDetail(),"/pageTwo": (context) => PageTwo(),},);}
}class PageOneDetail extends StatelessWidget {///此处context为MaterialApp下的context@overrideWidget build(BuildContext context) {return new Scaffold(appBar: AppBar(title: Text("第一个页面"),),body: RaisedButton(onPressed: () async {///获取第二个页面返回的数据 相当于Activity 的onActivityResultvar pushNamed = await Navigator.pushNamed(context, "/pageTwo");debugPrint(pushNamed);}, child: Text("点我跳转"),),);}
}class PageTwo extends StatelessWidget {@overrideWidget build(BuildContext context) {return new Scaffold(appBar: AppBar(title: Text("第二个页面"),),body: RaisedButton(onPressed: () {//路由pop弹出,结束页面Navigator.pop(context, "结束返回");}, child: Text("我是第二个页面"),));}
}

项目地址https://github.com/shunplus/flutter_xu

Flutter实现页面跳转切换(路由)相关推荐

  1. Android3个页面跳转代码,从零开始Android组件化改造(三) - 页面跳转与路由组件...

    组件化与传统开发有一个很大的不同,就是模块件的跳转,如果使用传统的显式跳转,势必会极大造成模块之间的耦合,这在组件化的开发中是绝对不允许的,因此在组件化开发中我们必须选用隐式跳转,并且我们需要把所有的 ...

  2. flutter刷新页面_Flutter BottomNavigationBar切换会刷新当前页面解决方

    问题描述 BottomNavigationBar 是flutter 中最常用的UI组建,刚接触时发现在切换tab 的时候,会刷新当前的所有状态,每个页面都会重新刷新.于是乎,在这里先记录下解决方案. ...

  3. 若依前后端分离版(vue)中配置页面跳转的路由

    场景 若依前后端分离版本地搭建开发环境并运行项目的教程: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108465662 在此基 ...

  4. Flutter 页面跳转

    目录 一.基本路由(静态路由) 1.不传值跳转 2.传值跳转 二.命名路由(动态路由) 1.不传值跳转 2.传值跳转 效果图 完整代码 在Flutter中页面跳转被称之为'路由'. 是通过Naviga ...

  5. 【Flutter】Hero 动画 ( Hero 动画使用流程 | 创建 Hero 动画核心组件 | 创建源页面 | 创建目的页面 | 页面跳转 )

    文章目录 ◯.Hero 动画简介 一.创建 Hero 动画核心组件 二.创建源页面 三.创建目的页面 四.页面跳转 五.完整代码示例 六.相关资源 ◯.Hero 动画简介 Hero Widget 动画 ...

  6. androidstuio实现页面跳转_vue-router 基础:4类路由跳转示例

    前言 <vue 基础>系列是再次回炉 vue 记的笔记,除了官网那部分知识点外,还会加入自己的一些理解.(里面会有部分和官网相同的文案,有经验的同学择感兴趣的阅读) 路由跳转,这属于路由参 ...

  7. 如何给Vue v-for循环渲染出的元素(导航栏) 批量添加点击事件 及 点击后添加css类样式 及 点击后路由跳转切换

    如何给Vue v-for循环渲染出的元素 批量添加点击事件 及 点击后添加css类样式 及 点击后路由跳转切换 能够实现或解决的问题 给Vue v-for循环出的元素批量添加点击事件,并以自己在数组中 ...

  8. 阻止路由跳转得方式_vue路由拦截及页面跳转的设置方法

    路由设置:router/index.js main.js: { if (to.matched.some(res => res.meta.requireAuth)) { // 验证是否需要登陆 i ...

  9. 【Android 组件化】路由组件 ( 页面跳转参数依赖注入 )

    文章目录 一.参数自动注入 二.自定义注解 三.使用 @Extra 自定义注解 四.注解处理器解析 @Extra 自定义注解 并生成相应 Activity 对应代码 五.博客资源 组件化系列博客 : ...

最新文章

  1. yum安装etcd集群
  2. 实验 3 简单的分支与循环结构
  3. WinCE文件目录定制及内存调整
  4. 深入理解.NET Core的基元(二) - 共享框架
  5. 用java和mysql开发网站怎么实现_如何用java开发一个网站?
  6. 2018java基础面试题(我自己用的,面试好多家公司基本会问到的问题和技术)
  7. 用java写分段函数_使用Java将分段函数转换为CSV文件
  8. 简单分享apache封IP的方法
  9. 查询数量查看表的所有相关列信息
  10. java上下左右_上下左右代替maquee的滚动代码
  11. js 代码混淆处理办法
  12. 设计模式(2) 生成器模式(BUILDER)
  13. 软件测试缺陷报告分析,测试报告中的缺陷分析和测试结论应该怎么写?
  14. P2P网贷谋求“去担保”:引入保险 收益下滑
  15. 『工程项目实践』表格识别 — V2.0
  16. Git命令问题:fatal: Exiting because of unfinished merge
  17. mysql和sqlite3 ios_iOS数据库存储之SQLite3
  18. “瘾品”经济正当道,低度酒成为新财富密码?
  19. 商业直播平台都有哪些
  20. linux 怎么把新硬盘分区,linux添加新硬盘分区

热门文章

  1. 从校园到职场 - 收起你的优越感
  2. go-micro项目实战三 消息订阅
  3. 安装免费视频剪辑软件运行时程序报错 Qt platform plugin could be initialized
  4. [IOI2021]地牢游戏
  5. 【电气专业知识问答】问:什么是变频器?如何实现变频?什么是高压变频器?
  6. Ubuntu系统rosdep update报错的解决办法(2022.10.3亲测有效)
  7. 做一块真正的放心好屏:品胜全新手机屏幕总成
  8. 4、Ubuntu20常用操作_文本编辑文件系统目录和文件操作用户管理和文件权限
  9. SpringBoot服务启动慢排查思路
  10. 小学生组团给钉钉打一星,整个阿里巴巴来安慰,个个是人才