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 ...
随机推荐
- 一种可以避免数据迁移的分库分表scale-out扩容模式
转自: http://jm.taobao.org/ 一种可以避免数据迁移的分库分表scale-out扩容方式 目前绝大多数应用采取的两种分库分表规则 mod方式 dayofweek系列日期方式(所有星 ...
- MG7780打印机喷嘴堵塞
1.深度清洗,打印喷嘴图案,发现有颜色没有打印出来 2.墨盒一加墨水就往外冒,以为是满的,其实是内部已经堵塞而加不进去,因为出墨口并没有墨水向外流(出墨口没有盖起来).解决办法就是用没有针头的针管从加 ...
- selenium UI自动化解决验证码的五种方法
TesseractPy3.py #coding=utf-8 import os import subprocess import traceback import logging from PIL i ...
- Struts2中action接收中文参数为乱码解决方法
老实说,中文乱码问题是每个程序员会经常遇到的问题,而且也是一个很头疼的问题.网上很多关于解决中文乱码的帖子,看几个之后你会发现大都是一样的.但是我们照着做,却还是无法解决乱码问题.我也是看了好多帖子, ...
- Linear regression with one variable - Cost function
摘要: 本文是吴恩达 (Andrew Ng)老师<机器学习>课程,第二章<单变量线性回归>中第7课时<代价函数>的视频原文字幕.为本人在视频学习过程中逐字逐句记录下 ...
- Jmeter逻辑控制器: If控制器的解读
Jmeter官网其实有很详细的文档,点此跳转到官网,下面我来解读一下官网的文档,如有错误,欢迎指出. 一.官网解读 Name 在结果树中显示的名字. Comments 备注.相当于代码中的注释. Ex ...
- Oracle 计算时间格式平均值
select to_char((to_date('2019-07-01', 'yyyy-mm-dd') + numtodsinterval(avg(begin_time_second), 'secon ...
- 【51nod】1634 刚体图
[51nod]1634 刚体图 给一个左边n个点右边m个点二分图求合法的连通图个数,每条边选了之后会带来价值乘2的贡献 类似城市规划那道题的计数 设\(g[i][j]\)为左边\(i\)个点,右边\( ...
- VC++操作注册表(创建,读取,更改,删除)
#include "stdafx.h" #include <Windows.h> #include <iostream> using namespace s ...
- c++语法笔记(中)
继承与派生 继承面向对象程序设计4个主要特征:抽象,封装,继承,多态性c++通过继承实现可重用性.有时两个类的内容基本相同或有一部分相同,这时可以利用原来声明的类作为基础,再加上新的内容即可,减少了工 ...