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 ...
随机推荐
- LeetCode_121. Best Time to Buy and Sell Stock
121. Best Time to Buy and Sell Stock Easy Say you have an array for which the ith element is the pri ...
- es6 fetch方法请求接口
fetch(url, { method: 'post', headers: { 'Content-type': 'application/x-www-form-urlencoded; charset= ...
- nice-validator表单验证插件
nice-validator表单验证插件的简单使用 前言 前端表单校验是过滤无效数据.假数据.有毒数据的第一步,是数据安全的第一道关卡,虽然我们不能100%相信客户端提交的数据(真正的校验还得在服务端 ...
- 单线程与多线程的应用 --Python3
1.单线程应用 from time import ctime, sleep from time import ctime, sleep class ThreadClass: def say(self) ...
- [转帖]详解JVM内存布局及GC原理,值得收藏
概述 https://www.toutiao.com/i6731345429574713868/ java发展历史上出现过很多垃圾回收器,各有各的适应场景,不仅仅是开发,作为运维也需要对这方面有一定的 ...
- jmeter XLSX 读取
import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFSheet; i ...
- xv6解析-- 多处理器操作
xv6可以运行多cpu的计算机上,这个os使用mycpu函数来标识初当前的cpu,使用struct cpu结构体来记录当前的CPU状态.使用cpus这些状态存放于cpus数组中,使用ncpu来标志cp ...
- Python之装饰器笔记
概述: 用于管理和增强函数和类行为的代码 提供一种在函数或类定义中插入自动运行代码的机制 特点 更明确的语法.更高的代码可维护性.更好的一致性 编写 函数基础: 将函数赋给变量.将函数作为参数传递. ...
- LOJ6583 ICPC World Finals 2019何以伊名始(广义后缀自动机)
对trie建SAM,询问串倒过来跑到的节点的|right|即为答案. #include<bits/stdc++.h> using namespace std; #define ll lon ...
- poj 3617 弱鸡贪心
比赛的时候扣了一道贪心的题目,不会写,,现在补一补一些基础的贪心. 题意:给定一个字符串s,要求按下列操作生成一个新串t--每次从s串中的最前和最后取一个字符给t,要求生成的t字典序最小. 题解:由于 ...