Flutter中的替换路由、返回到根路由
替换路由
当我们有三个页面,页面1,页面2,页面3。
期望点击页面1按钮,跳转到页面2,页面2点击返回,跳转到页面1;
点击页面2按钮,跳转到页面3,页面3点击返回,跳转到页面1,而不是页面2。
这时就可以用替换路来实现了。
在页面2点击按钮,跳转到页面3的时候,实际上是页面3替换页面2,这时点击返回就是页面1了。
import 'package:flutter/material.dart';
void main() {
final routes = {
"/":(context) => FirstPage(),
"/secondPage":(context) => SecondPage(),
"/thirdPage":(context) => ThirdPage()
};
var onGenerateRoute = (RouteSettings setttings) {
final String name = setttings.name;
final Function pageContentBuilder = routes[name];
if (pageContentBuilder != null) {
if(setttings.arguments != null) {
final Route route = MaterialPageRoute(
builder: (context) => pageContentBuilder(context,arguments:setttings.arguments)
);
return route;
}else{
final Route route = MaterialPageRoute(
builder: (context) => pageContentBuilder(context)
);
return route;
}
}
return null;
};
runApp(MaterialApp(
title: "Navigator",
initialRoute: "/",
onGenerateRoute: onGenerateRoute,
));
}
class FirstPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("第一页")),
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children : <Widget>[
RaisedButton(
child: Text("跳转到下一页"),
onPressed: () {
Navigator.of(context).pushNamed("/secondPage");
},
)
]
),
);
}
}
class SecondPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("第二页")),
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children : <Widget>[
RaisedButton(
child: Text("跳转到下一页"),
onPressed: () {
Navigator.of(context).pushReplacementNamed("/thirdPage"); // 替换路由
},
),
RaisedButton(
child: Text("返回到第一页"),
onPressed: () {
Navigator.of(context).pop();
},
)
]
),
);
}
}
class ThirdPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("第三页")),
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children : <Widget>[
RaisedButton(
child: Text("返回到第一页"),
onPressed: () {
Navigator.of(context).pop(); // 因为替换了路由的原因,直接pop()就可以了
},
)
]
),
);
}
}
返回到根路由
import 'package:flutter/material.dart';
void main() {
final routes = {
"/":(context) => HomePage(),
"/firstPage":(context) => FirstPage(),
"/secondPage":(context) => SecondPage(),
"/thirdPage":(context) => ThirdPage()
};
runApp(MaterialApp(
title: "Navigator",
initialRoute: "/",
routes: routes,
));
}
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("首页")),
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children : <Widget>[
RaisedButton(
child: Text("注册"),
onPressed: () {
Navigator.of(context).pushNamed("/firstPage");
},
)
]
),
);
}
}
class FirstPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("注册-第一步")),
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children : <Widget>[
Text("请填入手机号码"),
RaisedButton(
child: Text("下一步"),
onPressed: () {
Navigator.of(context).pushNamed("/secondPage");
},
),
]
),
);
}
}
class SecondPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("注册-第二步")),
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children : <Widget>[
Text("请输入手机验证码"),
RaisedButton(
child: Text("下一步"),
onPressed: () {
Navigator.of(context).pushNamed("/thirdPage");
},
)
]
),
);
}
}
class ThirdPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("注册-第三步")),
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children : <Widget>[
Text("请输入密码并确认"),
RaisedButton(
child: Text("完成"),
onPressed: () {
Navigator.of(context).pushAndRemoveUntil(
MaterialPageRoute(
builder: (context) => HomePage()), (route) => route == null);
},
)
]
),
);
}
}
Flutter中的替换路由、返回到根路由的更多相关文章
- 18Flutter中的路由、路由替换、返回到根路由:
路由: 正常跳转: Navigator.pushNamed(context,'/product'); 路由替换: Navigator.pushReplacementNamed(context, ' ...
- Flutter 中的路由
Flutter 中的路由通俗的讲就是页面跳转.在 Flutter 中通过 Navigator 组件管理路由导航. 并提供了管理堆栈的方法.如:Navigator.push 和 Navigator.po ...
- flutter中的路由跳转
在前面的基本路由和命名路由中,都演示了如何进行路由跳转,并且在路由跳转以后,可以借用系统自带的按钮就行返回上一级,当然了,也可以自定义按钮返回上一级. 返回上一级 在前面的例子中,当从Home.dar ...
- Flutter中管理路由栈的方法和应用
原文地址:https://www.jianshu.com/p/5df089d360e4 本文首先讲的Flutter中的路由,然后主要讲下Flutter中栈管理的几种方法. 了解下Route和Navig ...
- Flutter中的普通路由与命名路由(Navigator组件)
Flutter 中的路由通俗的讲就是页面跳转.在 Flutter 中通过 Navigator 组件管理路由导航.并提供了管理堆栈的方法.如:Navigator.push 和 Navigator.pop ...
- flutter中的命名路由
命名路由是区别于基本路由的一种存在,方便于大型项目中路由的统一管理,现在,在前面基本路由的项目基础上实现实现命名路由. 使用步骤 路由配置 命名路由在使用前,需要在根组件main.dart中进行简单的 ...
- Flutter 中的基本路由
Flutter 中的路由通俗的讲就是页面跳转.在 Flutter 中通过 Navigator 组件管理路由导航,并提供了管理堆栈的方法.如:Navigator.push 和 Navigator.pop ...
- flutter 登录后跳转到根路由
flutter 登录以后 会有返回箭头显示 因为 路由的切换导致不是路由的第一个页面,解决办法清空路由. Navigator.of(context).pushAndRemoveUntil( new ...
- flutter 跳转至根路由
上代码 //flutter 登录后跳转到根路由 Navigator.of(context).pushAndRemoveUntil( new MaterialPageRoute(builder: (co ...
随机推荐
- git clone时加上--depth 1
当项目过大时,git clone时会出现error: RPC failed; HTTP curl The requested URL returned error: Gateway Time-out的 ...
- Node.js在跑Express的时候有个时候会卡住按一下Ctrl+C又好了的解决办法
Node.js编写了一个基于Express的Web应用,但是有的时候这个应用会卡死. 后来发现原因是我使用了Windows原生的命令行,会出现这个问题. 也就是说我是在文件夹下面Shift+鼠标右键, ...
- linux EXT4格式分区扩容
1.查看现有的分区大小 2.关机增加磁盘大小为100G 3.查看磁盘扩容后状态 lsblk或dh -TH 4.进行分区扩展磁盘,保留根目录的起止位置. 5.删除根分区,不要保存 6.创建分区, ...
- 【转】Linux用Nasm巧汇编
看到一篇总结nasm的使用,解决了我的一点问题,下面是原文链接 原文链接:https://blog.csdn.net/zdwzzu2006/article/details/3990502
- Asp.net SignalR 实现服务端消息实时推送到所有Web端
ASP .NET SignalR是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.实际上 Asp.net SignalR 2 实现 服务端消息推送到Web端, 更加 ...
- C#学习笔记06--类/对象/访问修饰符/方法
编程思想 1.面向过程 面向过程是要把问题解决的过程分成有一定顺序的不同步骤, 然后按照步骤一步步的将问题解决. 2.面向对象 面向对象解决问题的思路是先分析问题中所涉及的对象, 然后 ...
- Jmeter plugins 之 Perfmon Metrics Collector(服务器性能监控)
客户端(Jmeter端) 1.安装plugins manager,然后安装 2.添加listener-(第1步成功后才可看到此功能) 服务端:(要监控的服务器) 1.下载ServerAgent,并 ...
- c++语法笔记(中)
继承与派生 继承面向对象程序设计4个主要特征:抽象,封装,继承,多态性c++通过继承实现可重用性.有时两个类的内容基本相同或有一部分相同,这时可以利用原来声明的类作为基础,再加上新的内容即可,减少了工 ...
- VirtualBox中CentOS7.2 网络配置(固定IP+联网)(亲测有效)
https://www.linuxidc.com/Linux/2018-04/151924.htm 一.前言 用虚拟机装Linux系统时,经常会出现一些问题.比如:从主机到虚拟机之间网络 ...
- springboot整合thymeleaf——引用静态资源
原html src="/css/index.css" thymeleaf中,th:src="@{/css/index.css}"