• 替换路由

当我们有三个页面,页面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()就可以了
},
)
]
),
);
}
}
  • 返回到根路由

比如我们从用户中心跳转到 registerFirst 页面,
然后从 registerFirst 页面跳转到 registerSecond页面,
然后从 registerSecond 跳转到了 registerThird 页面。
这个时候我们想的是 registerThird注册成功后返回到用户中心。
这个时候就用到了返回到根路由的方法。
 
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中的替换路由、返回到根路由的更多相关文章

  1. 18Flutter中的路由、路由替换、返回到根路由:

    路由: 正常跳转: Navigator.pushNamed(context,'/product');   路由替换: Navigator.pushReplacementNamed(context, ' ...

  2. Flutter 中的路由

    Flutter 中的路由通俗的讲就是页面跳转.在 Flutter 中通过 Navigator 组件管理路由导航. 并提供了管理堆栈的方法.如:Navigator.push 和 Navigator.po ...

  3. flutter中的路由跳转

    在前面的基本路由和命名路由中,都演示了如何进行路由跳转,并且在路由跳转以后,可以借用系统自带的按钮就行返回上一级,当然了,也可以自定义按钮返回上一级. 返回上一级 在前面的例子中,当从Home.dar ...

  4. Flutter中管理路由栈的方法和应用

    原文地址:https://www.jianshu.com/p/5df089d360e4 本文首先讲的Flutter中的路由,然后主要讲下Flutter中栈管理的几种方法. 了解下Route和Navig ...

  5. Flutter中的普通路由与命名路由(Navigator组件)

    Flutter 中的路由通俗的讲就是页面跳转.在 Flutter 中通过 Navigator 组件管理路由导航.并提供了管理堆栈的方法.如:Navigator.push 和 Navigator.pop ...

  6. flutter中的命名路由

    命名路由是区别于基本路由的一种存在,方便于大型项目中路由的统一管理,现在,在前面基本路由的项目基础上实现实现命名路由. 使用步骤 路由配置 命名路由在使用前,需要在根组件main.dart中进行简单的 ...

  7. Flutter 中的基本路由

    Flutter 中的路由通俗的讲就是页面跳转.在 Flutter 中通过 Navigator 组件管理路由导航,并提供了管理堆栈的方法.如:Navigator.push 和 Navigator.pop ...

  8. flutter 登录后跳转到根路由

    flutter 登录以后  会有返回箭头显示 因为  路由的切换导致不是路由的第一个页面,解决办法清空路由. Navigator.of(context).pushAndRemoveUntil( new ...

  9. flutter 跳转至根路由

    上代码 //flutter 登录后跳转到根路由 Navigator.of(context).pushAndRemoveUntil( new MaterialPageRoute(builder: (co ...

随机推荐

  1. 重新学习微信小程序

    基础学习: 传送门:http://www.jianshu.com/p/1cec15a81722 这个简书博客介绍的很详细,今天思思重新学习了一下. 一路到最后只遇到一个坑,还是自己不仔细.这里记录下: ...

  2. WIN10激活教程,亲测,有效

    WIN10激活教程: 1.打开开始菜单,找到设置,点开“更新和安全”,切换到“激活”选项卡,查看到当前系统的激活状态 2.在搜索框输入“CMD”,出现“命令提示符”工具时,右击选择“以管理员身份”运行 ...

  3. TCP Socket + UDP Socket

    小例子:http://soft.yesky.com/238/2035738.shtml 服务器程序: #include <iostream> #include <WinSock2.h ...

  4. vue中使用axios下载文件,兼容IE11

    一.设置axios返回值为blob 二.使用a标签的down属性下载,如果是IE浏览器,可以使用navigator.msSaveBlob进行下载 // data的数据类型是blob downloadF ...

  5. layuiAdmin (单页版)常见问题与解决方案

    最近项目开发中用到了layuiAdmin的单页版进行开发,期间遇到一些问题,在此总结一二: 单页版缓存问题 由于单页面版本的视图文件和静态资源模块都是动态加载的,所以可能存在浏览器的本地缓存问题,因此 ...

  6. 封装一个Model或者Vender类

    Model <?php /** * User: Eden * Date: 2019/3/21 * 共有内容 */ class WxPayModel extends Model { protect ...

  7. 生成 n 个不同的随机数且随机数区间为 [0,n)

    生成 n 个不同的随机数且随机数区间为 [0,n) Java 实现 import java.util.ArrayList; import java.util.List; import java.uti ...

  8. SQLServer 查询view中是否包含某个关键字

    在数据库view的创建中,会遇到一些跨数据库的view脚本,但是在将view更新到production的时候可能忘记更改database name,导致出现一些问题. 以下脚本可以检查出包含某个关键字 ...

  9. asp.net core-2.在vs2017中创建asp.net core应用程序

    今天我们用vs2017创建一个asp.net core 的应用程序,打开vs2017 点击:文件—>项目,选择asp.net core web 应用程序 点击确定 红框内就昨天用控制台去创建的应 ...

  10. C# SHA512和Base64加解密方法

    /// <summary> /// Get SHA512 Hash From String /// </summary> /// <param name="or ...