Flutter 《从0到1构建大前端应用》-所有知识点架构

文章目录

  • 一丶 路由简介
  • 二丶 路由栈
  • 三丶 自定义路由

一丶 路由简介

1.基本用法

2.静态路由

配置路由
main.dart

import 'package:flutter/material.dart';
import 'package:flutter_routes/errorpage.dart';
import 'package:flutter_routes/homepage.dart';
import 'package:flutter_routes/navigator_with_result.dart';
import 'package:flutter_routes/page1.dart';
import 'package:flutter_routes/page2.dart';
import 'package:flutter_routes/page3.dart';
import 'package:flutter_routes/page4.dart';
import 'package:flutter_routes/page5.dart';
import 'package:flutter_routes/pageroutebuilderresult.dart';
import 'package:flutter_routes/splash.dart';
import 'package:flutter_routes/testpageroutebuilder.dart';
import 'package:flutter_routes/todo.dart';
import 'package:flutter_routes/welcome.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: 'Flutter路由',initialRoute: '/PageRouteBuilder',theme: ThemeData(primarySwatch: Colors.blue,),routes: {'/page1': (context) => Page1(),'/page2': (context) => Page2(),'/page3': (context) => Page3(),'/page4': (context) => Page4(),'/page5': (context) => Page5(),'/todo': (context) => TodosScreen(),'/splash': (context) => Splash(),'/welcome': (context) => Welcome(),'/homepage': (context) => HomePage(),'/PageRouteBuilder': (context) => TestPageRouteBuilder(),'/PageRouteBuilderResult': (context) => PageRouteBuilderResult(),},onUnknownRoute: (RouteSettings setting) {String name = setting.name;print("未匹配到路由:$name");return new MaterialPageRoute(builder: (context) {return new ErrorPage();});},// home: Page1(),
//      home: TodosScreen(
//        todos: List.generate(
//          20,
//          (i) => Todo(
//                'Todo $i',
//                'A description of what needs to be done for Todo $i',
//              ),
//        ),
//      ),
//      home: HomeScreen(),
//      home: Splash(),home: Page1(),);}
}

page1.dart

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';class Page1 extends StatelessWidget {Page1({Key key}) : super(key: key);@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('page1'),),body: Center(child: RaisedButton(child: Text('跳转到Page2'),onPressed: () {//            Navigator.of(context).push(//              new MaterialPageRoute(//                builder: (context) {//                  return new Page2();//                },//              ),//            );Navigator.pushNamed(context, '/page2');   //静态路由跳转},),),);}
}

3.动态路由

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';class Todo {          //bean实体类final String title;final String description;Todo(this.title, this.description);
}class TodosScreen extends StatelessWidget {final List<Todo> todos;     //集合TodosScreen({Key key, @required this.todos}) : super(key: key);@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('Todos'),),body: ListView.builder(     //遍历数据itemCount: todos.length,itemBuilder: (context, index) {return ListTile(title: Text(todos[index].title),onTap: () {Navigator.push(context,MaterialPageRoute(    //动态路由带值跳转builder: (context) => DetailScreen(todo: todos[index]),),);},);},),);}
}class DetailScreen extends StatelessWidget {// Declare a field that holds the Todofinal Todo todo;// In the constructor, require a TodoDetailScreen({Key key, @required this.todo}) : super(key: key);   //接收传过来的todo对象@overrideWidget build(BuildContext context) {// Use the Todo to create our UIreturn Scaffold(appBar: AppBar(title: Text("${todo.title}"),   //显示传过来的值),body: Padding(padding: EdgeInsets.all(16.0),child: Text('${todo.description}'),),);}
}

4.参数回传

import 'package:flutter/material.dart';class HomeScreen extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('参数回传'),),body: Center(child: SelectionButton()),);}
}class SelectionButton extends StatelessWidget {@overrideWidget build(BuildContext context) {return RaisedButton(onPressed: () {_navigateAndDisplaySelection(context);},child: Text('课程选择'),);}_navigateAndDisplaySelection(BuildContext context) async {//通过await 的方式,给Navigator 的push结果添加了一个result,这个 result 就是回传的结果final result = await Navigator.push(      context,MaterialPageRoute(builder: (context) => SelectionScreen()),   //动态路由);Scaffold.of(context)..removeCurrentSnackBar()..showSnackBar(SnackBar(content: Text("$result")));   //通过SnackBar 将回传结果显示出来}
}class SelectionScreen extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('请选择一门课程'),),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[Padding(padding: const EdgeInsets.all(8.0),child: RaisedButton(onPressed: (){Navigator.pop(context, 'Android');    //返回上一级并且回传数据},child: Text('Android'),),),Padding(padding: const EdgeInsets.all(8.0),child: RaisedButton(onPressed: (){Navigator.pop(context, 'IOS');        //返回上一级并且回传数据},child: Text('IOS'),),),Padding(padding: const EdgeInsets.all(8.0),child: RaisedButton(onPressed: (){Navigator.pop(context, 'Flutter');      //返回上一级并且回传数据},child: Text('Flutter'),),)],),),);}
}

二丶 路由栈

1.路由栈详解


结论:Navigator 里的push 方法把元素添加到堆栈顶部,而pop则删除了顶部的元素

2.pushReplacementNamed 方法

Navigator.of(context).pushReplacementNamed('/page4');

3.popAndPushNamed 方法

与pushReplacementNamed 方法相似的有 popAndPushNamed 方法,效果是一致的,只是转场动画效果不同

4.pushNamedAndRemoveUntil 方法
用法一:确保删除homepage前所有路由栈的页面

 Navigator.of(context).pushNamedAndRemoveUntil('/homepage',(Route <dynamic> route) => false);


用法二:直接跳转回page2,同时删除掉page5~page2之间的页面实例,但是page5页面依然存在

 Navigator.of(context).pushNamedAndRemoveUntil('/page5',ModalRoute.withName('/page2'));


5.popUntil 方法
和pushNamedAndRemoveUntil 有点类似,只不过没有push操作,而是直接pop 到指定页面

 Navigator.popUntil(context, ModalRoute.withName('/page2'));

三丶 自定义路由


TestPageRouteBuilder.dart

import 'package:flutter/material.dart';
import 'package:flutter_routes/pageroutebuilderresult.dart';class TestPageRouteBuilder extends StatefulWidget {@override_TestPageRouteBuilderState createState() => _TestPageRouteBuilderState();
}class _TestPageRouteBuilderState extends State<TestPageRouteBuilder> {_onButtonTapCustom(Widget page) {     //实现跳转页面并带有动画效果Navigator.of(context).push(     //路由跳转PageRouteBuilder<Null>(       //路由页面建造者//页面建造者:(上下文对象,动画对象,次要的动画对象)pageBuilder: (BuildContext context, Animation<double> animation,Animation<double> secondaryAnimation) {return AnimatedBuilder(     //动画建造者animation: animation,     //动画对象builder: (BuildContext context, Widget child) {return Opacity(         //无透明opacity: animation.value, //无透明child: page,            //页面组件);},);},transitionDuration: Duration(milliseconds: 6000),    //持续时间6秒),);}@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('PageRouteBuilder'),),body: Center(child: Column(children: <Widget>[RaisedButton(padding: EdgeInsets.all(10.0),onPressed: () {_onButtonTapCustom(PageRouteBuilderResult());   //点击跳转页面并附带动画效果},child: Text('调用自定义路由',textAlign: TextAlign.center,style: TextStyle(fontSize: 13.0),),),Hero(tag: "hero1",child: ClipOval(      //椭圆形child: CustomLogo(   //自定义组件size: 60.0,       //传入大小为60),),),Hero(tag: "hero2",child: Material(      //材料color: Colors.transparent,child: Text("Hero效果",style: TextStyle(fontSize: 14.0, color: Colors.black),),))],)),);}
}class CustomLogo extends StatelessWidget {final double size;CustomLogo({this.size = 200.0});@overrideWidget build(BuildContext context) {return Container(color: Colors.lightBlueAccent,width: size,height: size,child: Center(child: FlutterLogo(size: size,),),);}
}

PageRouteBuilderResult

import 'package:flutter/material.dart';
import 'package:flutter_routes/testpageroutebuilder.dart';class PageRouteBuilderResult extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold(body: Padding(padding: EdgeInsets.all(30.0),child: Stack(children: <Widget>[Align(alignment: Alignment.center,child: Hero(      //Hero动画tag: "hero1",child: Container(height: 250.0,width: 250.0,child: CustomLogo(),),),),OutlineButton(onPressed: () => Navigator.of(context).pop(),child: Icon(Icons.close),)],),),);}
}

《Flutter 从0到1构建大前端应用》读后感—第7章【路由】相关推荐

  1. flutter从0到1构建大前端应用 pdf_前端骨架屏都是如何生成的

    作者:SHERlocked93 转发链接:https://mp.weixin.qq.com/s/j2XzwLPnalDCNaKkfjH-0Q 前言 相比于早些年前后端代码紧密耦合.后端工程师还得写前端 ...

  2. flutter从0到1构建大前端应用 pdf_推荐前端热门GitHub代码库「值得收藏」

    作者:刘小夕 前端宇宙 转发链接:https://mp.weixin.qq.com/s/Ypl3K2wVd_NrgCg_zogngA

  3. Flutter从0到1构建大前端应用(一):Dart环境配置及基础语法

    文章目录 代序 环境搭建 使用国内镜像 windowsDart环境变量配置教程 windows flutter环境变量配置教程 1.解压flutter-sdk到任意目录 2.配置flutter-sdk ...

  4. Flutter从0到1构建大前端应用(四):组件

    文章目录 前言 阅读建议 正文 MaterialApp 属性 Demo 效果展示 Scaffold 属性 Demo 效果展示 Container 基本用法 Demo 效果演示 Text 属性表: De ...

  5. 从0到1构建大促运营活动

    从0到1构建大促运营活动 前言 一.需求背景 依托流量 平台拉新 业务促活 二.需求分析 2.1 运营玩法分析 2.2 业务需求分析 2.3 领域对象识别 2.4 业务场景拆分 三.任务拆解 四.研发 ...

  6. 从0到1构建大数据生态系列1:数据蛮荒中的拓荒之举

    缘起 我们都知道,当前大数据的需求基本属于遍地开花.无论是帝都.魔都,还是广州.深圳,亦或是全国其他各地,都在搞大数据:不管是不到百人的微小公司,还是几百上千人的中型公司,亦或是上万的大型公司,都在需 ...

  7. Flutter 快速上手,秒变大前端

    简介:近两年Flutter的热度不断提升,无论在阿里还是外部公司,参与Flutter生态建设的人越来越多.Flutter作为跨端的UI框架,未来也有很大的可能像Rax一样作为集团内营销活动页面搭建的D ...

  8. 火了几年的大前端,现在怎么样了?

    大概从2017年开始,大前端这个名词开始出现,infoQ的一些技术大会也开始设置大前端议题,react native火的一塌糊涂,阿里.京东.去哪儿也开始推出自己的跨平台实践.时至今日,大前端已经发展 ...

  9. 大前端时代的乱流:带你了解最全面的 Flutter Web

    Flutter Web 稳定版本发布至今也有一年多了,经过这一年多的发展,今天就让我们来看看作为大前端时代的乱流,Flutter Web 究竟有什么不同之处,本篇分享主要内容是目前 Flutter 下 ...

  10. Flutter快学快用开篇词 通往大前端的一把关键钥匙 Flutter

    你好,欢迎来到 Flutter 课程,我是清弦. 近 10 年来,我一直在一线大厂从事 Web 前端研发工作,负责前端.中台业务以及跨端平台的研发和团队管理.目前大前端因为"一套代码,多端运 ...

最新文章

  1. 「AI大牛」陶大程出任京东探索研究院院长!曾连续6年入选全球高被引科学家...
  2. anaconda降级python失败_如何降级Python版本安装spyder?
  3. iOS 汉字转拼音 PinYin4Objc
  4. 阿里 10 年:一个普通技术人的成长之路
  5. 2018-2019-1 20165202 《信息安全系统设计基础》第四周学习总结
  6. 为什么视频压缩如此重要
  7. 《异构信息网络挖掘: 原理和方法(1)》一第2章 基于排名的聚类
  8. Centos7换yum源
  9. mysql 导出csv命令_MySQL 导出数据到csv文件的命令
  10. jdbc数据库配置mysql数据库_JDBC连接MySQL数据库(一)——数据库的基本连接
  11. python处理pdf文档_pyPdf - 用Python方便的处理PDF文档
  12. facebook加密货币项目_Facebook数字货币:Libra的起源—加密货币(比特币)
  13. 45 岁以后的程序员都到哪里去了?
  14. TCP的几个状态对于我们分析所起的作用SYN, FIN, ACK, PSH,
  15. 矩阵中求最大二维矩阵
  16. LCD1602温度显示程序设计流程
  17. 计算机通信子网的作用,通信子网
  18. Python.translate(table).maketrans(‘str1‘,‘str2‘)字符串翻译
  19. Unityt涂抹擦除功能
  20. 5、数码相框之使用多种方法支持多输入

热门文章

  1. easyUI 之datagrid 在前端自定义排序
  2. OSS重磅推出OSS Select——使用SQL选取文件的内容
  3. python __builtins__ map类 (44)
  4. Python、Lua和Ruby——脚本大P.K.
  5. Win7从VHD中启动 如何扩充虚拟磁盘
  6. EMNLP'21 | 检索式对话情感回复
  7. BERT中进行NER为什么没有使用CRF,我们使用DL进行序列标注问题的时候CRF是必备么?...
  8. 2021我的互联网秋招算法岗总结
  9. 【重点】Batch Normalization的诅咒
  10. 用Siamese和Dual BERT来做多源文本分类