Flutter学习教程之Route跳转以及数据传递

前言

我们知道移动应用页面跳转是非常重要的一部分,几乎我们的程序和用户打交道的就是页面,或者叫view,我们Android基本都是Activity和Fragment。而且Flutter当中叫做Route,它就是与用户打交道的页面。本文详细探索一下Flutter当中页面之间是怎么交互的。

Route类似Android中Activity,所以Flutter中的页面跳转类似Android中Activity之间跳转,Intent携带传递的数据。

正文

页面跳转

我们现在看看Flutter中是怎么进行页面交互的,也就是页面之间的跳转。

从上一个页面A跳转下一个页面B,有两种方式:

  • 通过Navigator.push()跳转
  • 通过Navigator.pushName()跳转

返回上一个页面:Navigator.pop();

提示:通过Navigator.pushNamed()跳转的,记住一定要注册routeName!!!

提示:通过Navigator.pushNamed()跳转的,记住一定要注册routeName!!!

提示:通过Navigator.pushNamed()跳转的,记住一定要注册routeName!!!

重要的事情说三遍😏😏😏!!!

代码如下:

//第一种:通过Navigator.push()跳转,类似Android中的startActivity(),指定Activity类名这种方式;
  Navigator.push(context, MaterialPageRoute(builder: (context) {
         return ThirdRoute();
        }));

//第二种方式:通过Navigator.pushName(),类似Android中的startActivity(),指定class全路径这种方式;
//先在MaterialApp里面注册Route
routes: { SecondRoute.routeName: (context) => SecondRoute(),}

Navigator.pushNamed(context, SecondRoute.routeName);

//返回上一个页面,类似Activity的finish();
Navigator.pop(context);

页面跳转并携带数据

基于上面的两种跳转方式,对应有两种

1、通过Navigator.push()跳转,将参数传到B页面的构造方法中,代码如下:

//A页面跳转,直接将参数传到B页面的构造方法里面
  Navigator.push(context,
        MaterialPageRoute(
         builder:(context) => BRouter(string)
))
//BRouter构造方法
 class BRouter extends StatelessWidget{
  final String str;
  BRouter(this.str);
 }

2、通过Navigator.pushNamed()跳转,使用ModalRoute.of()或者MaterialApp(CupertinoApp)构造器中的onGenerateRouter()获取参数,建议使用ModalRouter.of()。代码如下:

//A页面跳转,arguments就是需要传递的数据,这里的arguments是一个可需参数
Navigator.pushName(context,routerName,arguments);
//B页面提取参数,传的是什么类型,就用什么类型接值,这里用String演示
//第一种用ModalRouter接值
String arg = ModalRouter.of(context).setting.arguments;

//第二种在onGenerateRouter里面接值
MaterialApp(
 onGenerateRoute: (settings) {
  // 先根据setting里面的name判断是哪个Router
  if (settings.name == PassArgumentsScreen.routeName) {
   // 然后取出setting里面的arguments
   final ScreenArguments args = settings.arguments;
   // 然后再通过具体Router的构造方法穿过,类似上面的第一种方式接值方式
   return MaterialPageRoute(
    builder: (context) {
     return PassArgumentsScreen(
      title: args.title,
     );
    },
   );
  }
 },
);

返回上一个页面并返回数据

从当前页面B返回上一个页面A回传数据:

一般都是点击B页面某个控件,关闭当前页面,把需要的数据回传,类似Android中的SetResult(Result.ok,intent)

//当前页面B中的按钮
RaisedButton(
 onPressed: () {
  // 点击button,关闭页面,回到上一个页面,回传数据
  Navigator.pop(context, '回传的数据');
  // 这个方法通过方法名也能看出来,关闭当前页面,跳转到具体的页面,也可以回传数据。
  // tips:参数加[]说明是非必传参数
  Navigator.popAndPushNamed(context, routeName,[T result])
 },
 child: Text('返回'),
);

//回到上一个页面A,需要接值的话,在点击去下一个页面的需要使用到async延迟接收
//当BuildContext在Scaffold之前时,调用Scaffold.of(context)会报错。所以这里通过Builder Widget来解决
Builder(builder: (context){
       return RaisedButton(
        onPressed: () async {
         //2: 通过Navigator.push方式携带跳转
         String str = "我是第一个页面的数据";
         //疑问为什么只能用var接值,不能用String?
         var result = await Navigator.pushNamed(context, SecondRoute.routeName,
           arguments: str);
         if (result != null) {
          //通过snackBar将接收到的数据show出来。
          Scaffold.of(context).showSnackBar(SnackBar(
           content: Text(result),
           backgroundColor: Colors.blue,
           duration: Duration(milliseconds: 500),
          ));
         }
        },
        child: Text("携带数据跳转"),
       );
      }),

下面我们来看看最终的演示效果:

Flutter学习教程之Route跳转以及数据传递

总结

这样我们就把Flutter当中最基础的页面跳转,以及页面之间数据交互讲解完了,小伙伴可以愉快的去做各种页面交互啦😊😊😊。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。

实例源码地址

时间: 2019-08-12

jQuery插件学习教程之SlidesJs轮播+Validation验证

SlidesJs(轮播支持触屏)--官网(http://slidesjs.com) 1.简介 SlidesJs是基于Jquery(1.7.1+)的响应幻灯片插件.支持键盘,触摸,css3转换. 2.代码 <!doctype html> <head> <style> /* Prevents slides from flashing */ #slides { display:none; } </style> <script src="http:/

PHP内核学习教程之php opcode内核实现

opcode是计算机指令中的一部分,用于指定要执行的操作, 指令的格式和规范由处理器的指令规范指定. 除了指令本身以外通常还有指令所需要的操作数,可能有的指令不需要显式的操作数. 这些操作数可能是寄存器中的值,堆栈中的值,某块内存的值或者IO端口中的值等等. 通常opcode还有另一种称谓:字节码(byte codes). 例如Java虚拟机(JVM),.NET的通用中间语言(CIL: Common Intermeditate Language)等等. 1. Opcode简介 opcode是计算

IOS 应用之间的跳转和数据传递详解

说明:本文介绍app如何打开另一个app,并且传递数据. 一.简单说明 新建两个应用,分别为应用A和应用B. 实现要求:在appA的页面中点击对应的按钮,能够打开appB这个应用. 1.新建两个应用,分别为A和B. 142354418874108[1].png 150002248248878[1].png 2.设置应用B的url. 150005160123679[1].png 3.在应用A中编写打开app的代码 150007446066083[1].png 点击之后,会跳转到新的控制器. 注意:

微信小程序 页面跳转和数据传递实例详解

微信小程序 页面跳转和数据传递 1.先导 在Android中,我们Activity和Fragment都有栈的概念在里面,微信小程序页面也有栈的概念在里面.微信小程序页面跳转有四种方式: 1.wx.navigateTo(OBJECT): 2.wx.redirectTo(OBJECT): 3.wx.switchTab(OBJECT): 4.wx.navigateBack(OBJECT) 5.使用实现对应的跳转功能: 分析: 其中navigateTo是将原来的页面保存在页面栈中,在跳入到下一个页面的时

微信小程序 页面跳转及数据传递详解

微信小程序 页面跳转及数据传递详解 类似 Android 的 Intent 传值,微信小程序也一样可以传值: 例如:wxml 中写了一个函数跳转: <view class="itemWeight" catchtap="jumpToOverMissionList"> <view class="textStatus">已完成任务</view> <view class="containVertical

iOS页面跳转及数据传递(三种)

iOS页面跳转: 第一种 [self.navigationController pushViewController:subTableViewController animated:YES]; //描述:通过 NSNavigationBar 进行跳转  [self.navigationController popViewControllerAnimated:YES]; //描述:在子视图返回到上级视图 第二种 UIViewController *control = [[UIViewControl

JQuery EasyUI学习教程之datagrid 添加、修改、删除操作

一篇关于JQueryEasyUI学习之datagrid 添加.修改.删除 学习笔记教程有需要了解的朋友可参考本的笔记,批量删除,双击表单修改.选中行修改,增加行修改,再有就是扩展editor的方法,无需废话,直接上代码,代码中的注释写的很详细 <script type="text/javascript" charst="utf-8">var editFlag = undefined;//设置一个编辑标记 //因为layout框架指向href时,只取htm

Laravel学习教程之IOC容器的介绍与用例

前言 Laravel使用IoC(Inversion of Control,控制倒转,这是一个设计模式,可以先查看下百科)容器这个强有力的工具管理类依赖.依赖注入(也是一种设计模式,一般用于实现IoC)是一个不用编写固定代码来处理类之间依赖的方法,相反的,这些依赖是在运行时注入的,这样允许处理依赖时具有更大的灵活性. 理解 Laravel IoC容器是构建强大应用程序所必要的,也有助于Laravel 核心本身.下面话不多说了,来一起看看详细的介绍吧. 基本用例 绑定一个类型到容器 IoC 容器有两

Angular2学习教程之ng中变更检测问题详解

开发中遇到的问题 在开发中遇到一个这样的问题,代码不便透露,这里用简单的例子还原一下问题所在: 有三个组件,第一个是用来展示Todo列表的组件TodoComponent,Todo是个类,包含id和name属性. @Component({ selector: 'todo-list', template: ` <p *ngFor='let item of todos'>{{ item.name }}</p> `, }) export class TodoComponent{ @Inpu

React Native学习教程之Modal控件自定义弹出View详解

前言 最近在学习RN,好多知识都懒得写,趁今天有空,来一发吧,Modal控件的一个小demo:下面话不多说了,来一起看看详细的介绍吧. 参考文章地址:http://reactnative.cn/docs/0.27/modal.html#content Modal组件可以用来覆盖包含React Native根视图的原生视图(如UIViewController,Activity). 在嵌入React Native的混合应用中可以使用Modal.Modal可以使你应用中RN编写的那部分内容覆盖在原生视