Flutter 页面入栈和出栈
demo
import 'package:flutter/material.dart';
void main() => runApp(new MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: RaisedButton(
child: Text('跳转到 screen2'),
onPressed: () {
Navigator.of(context).push(MaterialPageRoute(
builder: (context) => Screen2(),
));
},
),
));
}
}
class Screen2 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: RaisedButton(
child: Text('back'),
onPressed: () {
Navigator.of(context).pop(null);
},
),
),
);
}
}
配置 routes 跳转
import 'package:flutter/material.dart';
void main() => runApp(new MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Ajnauw',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
routes: <String, WidgetBuilder>{
'/a': (BuildContext context) => MyPage(title: 'page A'),
'/b': (BuildContext context) => MyPage(title: 'page B'),
'/c': (BuildContext context) => MyPage(title: 'page C'),
},
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key}) : super(key: key);
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final List<String> _pages = <String>['/a', '/b', '/c'];
String togoPage = '/b';
_handleRadioValueChange(String nv) {
setState(() {
togoPage = nv;
});
}
// 返回一个小widget
Widget _generagorRadio(String pageName) {
return GestureDetector(
onTap: () {
_handleRadioValueChange(pageName);
},
child: Container(
decoration: BoxDecoration(
color: Colors.grey[200],
),
margin: EdgeInsets.only(top: 8.0),
child: Row(
children: <Widget>[
Radio(
value: pageName,
onChanged: _handleRadioValueChange,
groupValue: togoPage,
),
Text(pageName),
],
),
),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('demo'),
),
body: ListView(
children: <Widget>[
Container(
margin: EdgeInsets.only(left: 8.0, right: 8.0),
child: Column(
children: _pages
.map((String pageName) => _generagorRadio(pageName))
.toList(),
),
),
Container(
margin: EdgeInsets.only(left: 8.0, right: 8.0, top: 8.0),
child: RaisedButton(
onPressed: () {
// 点击触发事件,页面入栈
Navigator.pushNamed(context, togoPage);
},
color: Theme.of(context).primaryColor,
child: Text('跳转新页面 $togoPage'),
),
),
],
),
);
}
}
class MyPage extends StatelessWidget {
final String title;
MyPage({Key key, this.title}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(title),
),
body: Center(
child: Text(title),
),
);
}
}
动画页面路劲转换
Navigator.of(context).push(
PageRouteBuilder(
transitionDuration: Duration(milliseconds: 500),
pageBuilder: (context, animation, secondaryAnimation) =>
Screen2(),
transitionsBuilder:
(context, animation, secondaryAnimation, child) {
var begin = Offset(0.0, 1.0);
var end = Offset.zero;
var curve = Curves.ease;
var tween = Tween(begin: begin, end: end);
var curvedAnimation = CurvedAnimation(
parent: animation,
curve: curve,
);
return SlideTransition(
position: tween.animate(curvedAnimation),
child: child,
);
},
),
);
pushReplacement
通过推送给定路线替换导航器的当前路线,然后在新路线完成动画输入后处置前一路线
Navigator.of(context).pushReplacement(
MaterialPageRoute(builder: (context) => HomePage())
)
设置404页面
MaterialApp(
navigatorObservers: [routeObserver],
home: HomePage(),
title: 'home',
onUnknownRoute: (RouteSettings settings) {
return MaterialPageRoute(
builder: (context) => Title(
title: '页面未找到',
color: Theme.of(context).primaryColor,
child: Scaffold(
appBar: AppBar(),
body: Center(child: Text('404')),
),
),
settings: RouteSettings(
name: 'not-found',
),
);
},
);
设置不同的进场/出场动画
Navigator.of(context).push(
PageRouteBuilder(
transitionDuration: Duration(milliseconds: 500),
pageBuilder: (context, animation, secondaryAnimation) =>
Scaffold(
backgroundColor: Colors.red,
body: Center(child: Text('page 2')),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.backspace),
onPressed: () => Navigator.of(context).pop(),
),
),
transitionsBuilder: (
context,
Animation<double> animation,
Animation<double> secondaryAnimation,
child,
) {
return SlideTransition(
position: Tween(
// 关键点
begin: animation.status == AnimationStatus.reverse
? const Offset(-1.0, -1.0)
: const Offset(1.0, 1.0),
end: Offset.zero,
).animate(animation),
child: child,
);
}),
);
Flutter 页面入栈和出栈的更多相关文章
- [Xcode 实际操作]三、视图控制器-(5)使用UINavigationController视图入栈和出栈
目录:[Swift]Xcode实际操作 本文将演示使用导航控制器的几个跳转方式 选择编辑第二个视图控制器文件 import UIKit //定义一个全局变量,用来记录当前显示区域的视图的编号 clas ...
- N个数依次入栈,出栈顺序有多少种?
对于每一个数来说,必须进栈一次.出栈一次.我们把进栈设为状态‘1’,出栈设为状态‘0’.n个数的所有状态对应n个1和n个0组成的2n位二进制数.由于等待入栈的操作数按照1‥n的顺序排列.入栈的操作数b ...
- C++中栈的出栈,入栈规则:A,B,C,D,E
考题: 栈底至栈顶一次存放元素 ABCD 在第五个元素E入栈之前 栈中元素可以出栈,则出栈序列可能是_____a d___________. a. ABCED b. DBCEA c. CD ...
- N个数依次入栈,出栈顺序有多少种
题目:N个数依次入栈,出栈顺序有多少种? 首先介绍一下卡特兰数:卡特兰数前几项为 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 2 ...
- HDU 1022 Train Problem I[给出两个长n的串,入栈和出栈顺序,判断入栈顺序是否可以匹配出栈顺序]
Train Problem I 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 As the new term comes, the Ignatius Train Sta ...
- php 栈、 出栈、入栈
最近在面试的时候被问到栈,回来做个总结,希望对大家有帮助 栈是线性表的一种,他的特点是后入先出,可以这么理解,栈就像一个存东西的盒子,先放进去的在最底层,后放进去的在上层,因为上层的东西把底层的东西压 ...
- flask 源码专题(三):请求上下文和应用上下文入栈与出栈
1.请求上下文和应用上下文入栈 # 将ctx入栈,但是内部也将应用上下文入栈 ctx.push() def push(self): # 获取到的 top == ctx top = _request_c ...
- python栈的实现(入栈,出栈)
#coding=utf-8 class Stack(): def __init__(st,size):#栈的初始化 st.stack=[]; st.size=size; st.top=-1 def p ...
- C语言数据结构-链式栈的实现-初始化、销毁、长度、取栈顶元素、查找、入栈、出栈、显示操作
1.数据结构-链式栈的实现-C语言 //链式栈的链式结构 typedef struct StackNode { int data; struct StackNode *next; } StackNod ...
随机推荐
- STM32 的PWM关闭方法
采用直接修改PWM的占空比,可以实现对PWM的关闭,且切换到稳定的高或者低状态.
- 论文学习笔记--无缺陷样本产品表面缺陷检测 A Surface Defect Detection Method Based on Positive Samples
文章下载地址:A Surface Defect Detection Method Based on Positive Samples 第一部分 论文中文翻译 摘要:基于机器视觉的表面缺陷检测和分类可 ...
- docker简单介绍----存储
docker容器 中使用Volumes来实现数据的持久性,因为容器的删除会丢失数据,而关闭或者重启容器不会丢失数据 docker run -v即可使用Volumes 1.docker-managed ...
- 不使用synchronized和lock 锁实现线程安全单例
单例实现方式一,锁机制 public class Singleton { private static Singleton singleton=null; public Singleton() { } ...
- Vue实例学习过程中碰到的小问题
在使用插值表达式{{ }}取data中list数组中的值时把整个表达式当做文本显示了,原因不明,但是使用v-text替换插值表达式之后问题得到解决. 原因已经查明,因为第78行,定义对象car时后面 ...
- selenium+python自动化测试,上传文件怎样实现
其实上传图片操作与输入框的输入是一样的,一种是在输入框中输入字符信息,一种是在输入文件格式的信息,下面是用代码实现上传文件, from selenium import webdriverfrom ti ...
- 文件上传的一个坑 Apache上传组件和SpringMVC自带上传冲突
List list = upload.parseRequest(request); 接受不到数据,size=0; 原因就是下面这货造成的 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ bean id=&qu ...
- hadoop mkdir: Cannot create directory /usr. Name node is in safe mode.
今天在hdfs上面创建文件夹的时候报了:org.apache.hadoop.dfs.SafeModeException: Cannot delete /user/hadoop/input. Name ...
- 学习笔记_J2EE_Mybatis_02_mybatis注解配置入门
mybatis入门示例 声明式 1.概述 mybatis的注解配置版,为了偷懒,直接在之前xml版本的文件上修改的:同样为了偷懒,今天只写示例V1.0版基础配置版 ,后面再更新细节. 一个不偷懒 ...
- VMware虚拟机安装WIN7
VMware在IT工作人员的学习之中,使用的较多,故聊一聊VMware中WIN7的安装: 第一步:安装VMware,这个软件百度就可以下载,但是是收费软件,注册码可以百度到. 第二步:VMware安装 ...