一、flutter中页面跳转之Navigator

核心概念

RouteNavigator
定义:Route :是页面的一个抽象。
路由(Route)在移动开发中通常指页面(Page),这跟web开发中单页应用的Route概念意义是相同的,Route在Android中通常指一个Activity,在iOS中指一个ViewController。
那么,路由就是不同Route之间的跳转。
Navigator:是负责管理Route的Widget,并且通过入栈和出栈实现页面间的跳转。


Navigator如何管理 携带值的路由跳转
Navigator是一个栈结构,通过push 和pop来操作。push加入一个Route,并将返回一个Future对象。Future push(BuildContext context, Route route) pop则将栈顶元素出栈。 bool pop(BuildContext context, [ result ])result为页面关闭时返回给上一个页面的数据。 命名的路由(Named Route)Navigator类中第一个参数为context的静态方法都对应一个Navigator的实例方法, 比如Navigator.push(BuildContext context, Route route)等价Navigator.of(context).push(Route route) 很多情况下在路由跳转时我们需要带一些参数,比如打开商品详情页时,我们需要带一个商品id,这样商品详情页才知道展示哪个商品信息;又比如我们在填写订单时需要选择收货地址,打开地址选择页后,可以将用户选择的地址返回到订单页等等。非命名路由传值:通过Navigator.push(context,route)来传递。值传回:Navigator.pop(context,result),result就是要返回的值。

1.使用命名方式来管理页面

mian.dart

import 'package:flutter/material.dart';
import 'package:navigatortest/page/MyHomePage.dart';
import 'package:navigatortest/router/route_handler.dart';void main() {runApp(const MyApp());
}class MyApp extends StatefulWidget {const MyApp({Key key}) : super(key: key);// static final RouteObserver<PageRoute> routeObserver =//     RouteObserver<PageRoute>(); //监听堆栈的变化@override_MyAppState createState() => _MyAppState();
}class _MyAppState extends State<MyApp> {@overrideWidget build(BuildContext context) {return MaterialApp(// navigatorObservers: [MyApp.routeObserver], //onGenerateRoute: AppRouteManager.getInstance().onGenerateRoute,home: MyHomePage(),);}
}

层级目录
homePage.dart

import 'package:flutter/material.dart';
class MyHomePage extends StatefulWidget {const MyHomePage({ Key key }) : super(key: key);@override_MyHomePageState createState() => _MyHomePageState();
}class _MyHomePageState extends State<MyHomePage> {@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text(_userName),),body: Container(child:Column(children: [RaisedButton(child: Text("无参路由跳转"),onPressed: (){Navigator.pushNamed(context, '/firstPage', );},),],),),);}

firstPage.dart

import 'package:flutter/material.dart';class firstPage extends StatefulWidget {const firstPage({Key key}) : super(key: key);@override_firstPageState createState() => _firstPageState();
}class _firstPageState extends State<firstPage> {@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("firstpage"),),body: Container(child: Column(children: [RaisedButton(child: Text("page1"),onPressed: () {Navigator.pop(context);},),],),),);}
}


navigator.pop(context)携带参数返回
firstPage.dart

import 'package:flutter/material.dart';class firstPage extends StatefulWidget {const firstPage({Key key}) : super(key: key);@override_firstPageState createState() => _firstPageState();
}class _firstPageState extends State<firstPage> {@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("firstpage"),),body: Container(child: Column(children: [RaisedButton(child: Text("携带参数返回"),onPressed: () {Navigator.pop(context, {"name": "携带参数返回",});},),],),),);}
}

HomePage.dart

import 'package:flutter/material.dart';
class MyHomePage extends StatefulWidget {const MyHomePage({ Key key }) : super(key: key);@override_MyHomePageState createState() => _MyHomePageState();
}class _MyHomePageState extends State<MyHomePage> {String _userName  = "";@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text(_userName),),body: Container(child:Column(children: [// RaisedButton(//   child: Text("无参路由跳转"),//   onPressed: (){//     Navigator.pushNamed(context, '/firstPage', );//   },// ),//    RaisedButton(//   child: Text("代参数路由跳转"),//   onPressed: () {//     Navigator.pushNamed(context, '/SecondPage', arguments: {//       "name":"张三"//     });//   },// ),RaisedButton(child: Text("路由返回传值"),onPressed: (){_getName();},),// SizedBox(height: 100,),],),),);}void _getName() async {dynamic params = await Navigator.of(context).pushNamed("/firstPage");if (params != null) {setState(() {_userName = params["name"];});}}
}

homepage.dart

import 'package:flutter/material.dart';
class MyHomePage extends StatefulWidget {const MyHomePage({ Key key }) : super(key: key);@override_MyHomePageState createState() => _MyHomePageState();
}class _MyHomePageState extends State<MyHomePage> {String _userName  = "";@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text(_userName),),body: Container(child:Column(children: [// RaisedButton(//   child: Text("无参路由跳转"),//   onPressed: (){//     Navigator.pushNamed(context, '/firstPage', );//   },// ),RaisedButton(child: Text("代参数路由跳转"),onPressed: () {Navigator.pushNamed(context, '/SecondPage', arguments: {"name":"张三"});},),//    RaisedButton(//   child: Text("路由返回传值"),//   onPressed: (){//    _getName();//   },// ),// SizedBox(height: 100,),],),),);}void _getName() async {dynamic params = await Navigator.of(context).pushNamed("/firstPage");if (params != null) {setState(() {_userName = params["name"];});}}
}

secodePage.dart

import 'package:flutter/material.dart';class SecondPage extends StatefulWidget {final Map arguments;SecondPage({this.arguments});@override_SecondPageState createState() => _SecondPageState();
}class _SecondPageState extends State<SecondPage> {String name;@overridevoid initState() { super.initState();name = widget.arguments['name'];}@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("page2"),),body: Container(child:Column(children: [RaisedButton(child: Text("返回上一级"),onPressed: (){Navigator.pop(context,"路由返回携带");},),Container(child: Text(name),)],),),);}
}

二、flutter异步编程

所谓异步编程表示同时可以做几件事情,不需要等待任何事情做完就可以做其他的事情.这样可以提高程序运行的效率

三、Flutter-Json转实体类(插件FlutterJsonBeanFactory)

FlutterJsonBeanFactory

重启一下

2.

在pubspec.yaml中引入下面的库
dependencies:json_annotation: ^4.0.1build_runner: ^2.0.4json_serializable: ^4.1.3

创建实体类
https://caijinglong.github.io/json2dart/index_ch.html
使用Json工具生成实体类

生成fromJson和toJson方法

在terminal中输入命令:
flutter packages pub run build_runner build

3.JSON to Dart

flutter中页面跳转之Navigator相关推荐

  1. Flutter实现页面跳转切换(路由)

    在移动开发中页面跳转也被称为导航管理,也就是路由,在Flutter中是如何实现的呢 import 'package:flutter/material.dart';///页面跳转 void main() ...

  2. 使用Flash制作IeBook中页面跳转的按钮

    在IeBook中,如果是纯文字无特效按钮可以直接在IeBook中插入文字,并在属性栏中指定链接类型为页面跳转. 如果是swf格式的特效按钮,如果设置了链接值的话,鼠标经过滤镜特效会不起作用. 于是转换 ...

  3. Swift中页面跳转与传值:

    1.简单方式 首先,Swift的跳转可分为利用xib文件跳转与storyboard跳转两种方法,我这里选择使用storyboard的界面跳转方法. 1.通过在storyboard中拉button控件建 ...

  4. vue中页面跳转传值_vue的页面跳转方式和传值、取值

    写业务中,从一个页面跳转到另一个页面,经常需要传值和取值,如何实现? 1.通过router-link进行跳转,传递方式: 使用query传递参数,路由必须使用path引入, 使用params传递参数, ...

  5. java 新窗口跳转页面_Java web开发中页面跳转小技巧——跳转后新页面在新窗口打开...

    最近学习Java web,在学习过程中想实现一个需求,就是在jsp页面跳转的时候,希望跳转后的新页面在新窗口中打开, 而不是覆盖原来的页面,这个需求使我困惑了好长时间,后来通过大海捞针似的在网上寻找方 ...

  6. odoo中页面跳转相关

    在添加自定义服务器动作 "复制全部"后发现直接创建了新的记录,并且直接进入到form保存完的状态. 如何解决: if yourself_obj_copy:return {'type ...

  7. vue中页面跳转传值_vue跳转方式(打开新页面)及传参操作示例

    本文实例讲述了vue跳转方式(打开新页面)及传参操作.分享给大家供大家参考,具体如下: 1. router-link跳转 // 直接写上跳转的地址 link跳转 // 添加参数 // 参数获取 id ...

  8. JSP中页面跳转response.sendRedirect()和request.getRequestDispatcher()的区别

    Java Web开发中,采用MVC模式的时候,在控制器完成模型的调用之后会选择界面对用户响应,用常有2种方式 1,通过response对象的sendRedirect方法重定向: response.se ...

  9. vue中页面跳转,显示在顶部

    页面之间跳转,打开新的一个页面显示在顶部 在main.js 中添加代码: router.afterEach((to, from, next) => {window.scrollTo(0, 0) ...

  10. vue中页面跳转传值_vue 页面跳转传参

    页面之间的跳转传参,正常前端js里写 window.location.href="xxxxx?id=1" 就可以了: 但是vue不一样 需要操作的是路由history,需要用到 V ...

最新文章

  1. C#中的预处理指令详解
  2. 1190 最小公倍数之和 V2
  3. 740. Delete and Earn
  4. Vue3学习笔记- NPM包管理工具
  5. appscan如何进行web端安全性测试_常用的软件测试工具有哪些?
  6. 计算机大数乘法引发的思考 | CSDN 博文精选
  7. Java数据类型,Hibernate数据类型,标准sql数据类型之间的对应表
  8. [Python] L1-026. I Love GPLT-PAT团体程序设计天梯赛GPLT
  9. seata 使用oracle_使用Seata彻底解决Spring Cloud中的分布式事务问题!
  10. python爬虫学习整理——爬虫入门(1)
  11. java正整数正则表达式_Java 正则表达式
  12. 华为wifi的虚拟服务器,华为路由器虚拟服务器设置方法
  13. linux bt下载没速度慢,linux bt速度之王
  14. 我们应该怎样来提高自己的编程能力?
  15. Git详解之一 Git起步
  16. python打包exe报错编码问题_python打包成exe,但执行exe报错,求解。
  17. linux哪个版本支持tipc,Linux TIPC 2.0 Programmerapos;s Guide文档.doc
  18. Java Web 开发实战经典 基础篇(1)
  19. 1688api 图片搜索功能
  20. 如何用 Dall-E2 制作这些超可爱的柔软毛绒玩具

热门文章

  1. 百度一下,你就知道.2
  2. Screeps入门: harvest,upgrader,builder初级自动化
  3. 卡贴机变无锁教程_如何让“有锁”iPhone变“无锁”?“有锁”iPhone变“无锁”设置教程...
  4. 股指期货术语大全(股指期货的意思)
  5. 计算机工程信息学院严翔,《频频相见》严翔、严晓频、胡凌虹,交通社出品,有容书邦发行著【摘要 书评 在线阅读】-苏宁易购图书...
  6. 瞎扯数学分析:微积分
  7. mount.nfs: mount system call failed问题解决
  8. BFF —— Backend For Frontend
  9. 怎么设置html表格的最小宽度,HTML表格的宽度怎么设置
  10. android 4.1.2大小,4.1.2 Activity初窥门径