文章目录

  • 导航到一个新页面和返回
  • 导航到一个新页面带参数返回
  • 通过构造函数携带参数跳转
  • 通过RoutSettings携带参数跳转
  • 命名路由
  • 给特定路由传参
  • 转场动画路由Hero

导航到一个新页面和返回

Navigator.push方法
跳转后样子

import 'package:flutter/material.dart';void main(){runApp(MaterialApp(title: '基本路由',home: FirstRoute(),));
}class FirstRoute extends StatelessWidget{@overrideWidget build(BuildContext context) {// TODO: implement buildreturn Scaffold(appBar: AppBar(title: Text('First Route'),),body: Center(child: RaisedButton(child: Text('Open route'),onPressed: (){
//              Navigator.push跳转的页面自带返回键Navigator.push(context, MaterialPageRoute(builder: (context) => SecondRoute()));}),),);}
}class SecondRoute extends StatelessWidget{@overrideWidget build(BuildContext context) {// TODO: implement buildreturn Scaffold(appBar: AppBar(title: Text('Second Route'),),body: Center(child: RaisedButton(child: Text('Go back'),onPressed: (){Navigator.pop(context);}),),);}
}

导航到一个新页面带参数返回

import 'package:flutter/material.dart';void main() {runApp(MaterialApp(title: '带参数返回路由',home: HomeScreen(),));
}
//第一屏页面
class HomeScreen extends StatelessWidget {@overrideWidget build(BuildContext context) {// TODO: implement buildreturn Scaffold(appBar: AppBar(title: Text('Returning with data'),),body: Center(child: SelectionButton(),),);}
}class SelectionButton extends StatelessWidget {@overrideWidget build(BuildContext context) {// TODO: implement buildreturn RaisedButton(onPressed: () {_navigateAndDisplaySelection(context);},child: Text('Pick an option, any option!'),);}_navigateAndDisplaySelection(BuildContext context) async {//用result接受第二屏的返回值final result = await Navigator.push(context,MaterialPageRoute(builder: (context) => SelectionScreen()),);//级联操作符 (..) 可以在同一个对象上 连续调用多个函数以及访问成员变量。 使用级联操作符可以避免创建 临时变量Scaffold.of(context)..removeCurrentSnackBar()..showSnackBar(SnackBar(content: Text("$result"),));}
}//第二屏页面
class SelectionScreen extends StatelessWidget {@overrideWidget build(BuildContext context) {// TODO: implement buildreturn Scaffold(appBar: AppBar(title: Text('Pick an option'),),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[Padding(padding: const EdgeInsets.all(8.0),child: RaisedButton(onPressed: () {// 在这里返回 "Yep"Navigator.pop(context,'Yep!');},child: Text('Yep'),),),Padding(padding: const EdgeInsets.all(8.0),child: RaisedButton(onPressed: () {// 在这里返回 "Noep"Navigator.pop(context,'Noep!');}, child: Text('Noep'),),),],),),);}
}

通过构造函数携带参数跳转

import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';void main() {runApp(MaterialApp(title: '携参数跳转',home:TodosScreen(todos: List.generate(20, (i)=> Todo('Todo $i','A description of what needs to be done for Todo $i'))),));
}// 数据类(要携带的数据)
class Todo {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) {// TODO: implement buildreturn 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{final Todo todo;DetailScreen({Key key, @required this.todo}) : super(key: key);@overrideWidget build(BuildContext context) {// TODO: implement buildreturn Scaffold(appBar: AppBar(title: Text(todo.title),),body: Padding(padding: EdgeInsets.all(16.0),child: Text(todo.description),),);}
}

通过RoutSettings携带参数跳转

import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';void main() {runApp(MaterialApp(title: 'RouteSettings携参数跳转',home: TodosScreen(todos: List.generate(20,(i) => Todo('Todo $i','A description of what needs to be done for Todo $i'))),));
}// 数据类(要携带的数据)
class Todo {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) {// TODO: implement buildreturn 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(),//通过RouteSettings传递参数settings: RouteSettings(arguments: todos[index])));},);}),);}
}//构造函数接受传递过来的参数
class DetailScreen extends StatelessWidget {//  DetailScreen({Key key, @required this.todo}) : super(key: key);@overrideWidget build(BuildContext context) {//通过ModalRoute取参数final Todo todo = ModalRoute.of(context).settings.arguments;return Scaffold(appBar: AppBar(title: Text(todo.title),),body: Padding(padding: EdgeInsets.all(16.0),child: Text(todo.description),),);}
}

命名路由

import 'package:flutter/material.dart';void main() {runApp(MaterialApp(title: '命名路由',//当使用 initialRoute 时,需要确保你没有同时定义 home 属性initialRoute: '/',routes: {// 当我们跳转到“/”时,构建 FirstScreen'/':(context) => FirstScreen(),// 当我们跳转到“/second”时,构建 SecondScreen'/second':(context) =>SecondScreen(),},));
}class FirstScreen extends StatelessWidget {@overrideWidget build(BuildContext context) {// TODO: implement buildreturn Scaffold(appBar: AppBar(title: Text('First Screen'),),body: Center(child: RaisedButton(onPressed: () {
//          点击时跳转到第二个界面Navigator.pushNamed(context, '/second');},child: Text('Launch screen'),),),);}}
class SecondScreen extends StatelessWidget{@overrideWidget build(BuildContext context) {// TODO: implement buildreturn Scaffold(appBar: AppBar(title: Text('Second Screen'),),body: Center(child: RaisedButton(onPressed: (){// 点击时跳转回第一个界面!Navigator.pop(context);},child: Text('Go back!'),),),);}}

给特定路由传参

import 'package:flutter/material.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(//通过 onGenerateRoute() 函数提取参数,然后把参数传递给组件,和routes是两种方式onGenerateRoute: (settings) {if (settings.name == PassArgumentsScreen.routeName) {final ScreenArguments arguments = settings.arguments;return MaterialPageRoute(builder: (context) {return PassArgumentsScreen(title: arguments.title,message: arguments.message,);});}return null;},title: '给特定路由传参',home: HomeScreen(),routes: {//把组件注册到路由表中ExtractArgumentsScreen.routeName: (context) => ExtractArgumentsScreen(),},);}
}class ScreenArguments {final String title;final String message;ScreenArguments(this.title, this.message);
}class HomeScreen extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('Home Screen'),),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[RaisedButton(onPressed: () {Navigator.pushNamed(context, ExtractArgumentsScreen.routeName,arguments: ScreenArguments('秦时明月','沧海横流',));},child: Text('Navigate to screen that extracts arguments'),),RaisedButton(onPressed: () {Navigator.pushNamed(context, PassArgumentsScreen.routeName,arguments: ScreenArguments('九歌·少司命','悲莫悲兮生别离,乐莫乐兮新相知'));},child: Text('Navigate to a named that accepts arguments'),),],),),);}
}//ModalRoute接受参数
class ExtractArgumentsScreen extends StatelessWidget {static const routeName = '/extractArguments';@overrideWidget build(BuildContext context) {
//    ModalRoute.of() 方法返回的是当前路由及其携带的参数final ScreenArguments arguments = ModalRoute.of(context).settings.arguments;return Scaffold(appBar: AppBar(title: Text(arguments.title),),body: Center(child: Text(arguments.message),),);}
}//构造方法接受参数
class PassArgumentsScreen extends StatelessWidget {static const routeName = '/passArguments';final String title;final String message;PassArgumentsScreen({Key key, @required this.title, @required this.message}): super(key: key);@overrideWidget build(BuildContext context) {// TODO: implement buildreturn Scaffold(appBar: AppBar(title: Text(title),),body: Center(child: Text(message),),);}
}

转场动画路由Hero

import 'package:flutter/material.dart';void main() => runApp(HeroAPP());class HeroAPP extends StatelessWidget{@overrideWidget build(BuildContext context) {// TODO: implement buildreturn MaterialApp(title: 'Transition Demo',home: MainScreen(),);}}
class MainScreen extends StatelessWidget {@overrideWidget build(BuildContext context) {// TODO: implement buildreturn Scaffold(appBar: AppBar(title: Text('Main Screen'),),body: GestureDetector(onTap: () {Navigator.push(context, MaterialPageRoute(builder: (_) {return DetailScreen();}));},child: Hero(tag: 'imageHero',child: Image.network('https://picsum.photos/250?image=9'),)),);}
}class DetailScreen extends StatelessWidget {@overrideWidget build(BuildContext context) {// TODO: implement buildreturn Scaffold(body: GestureDetector(onTap: () {Navigator.pop(context);},child: Center(child: Hero(tag: 'imageHero',child: Image.network('https://picsum.photos/250?image=9'),),),),);}
}

Flutter中的路由实现方式相关推荐

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

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_34396103/arti ...

  2. flutter中的路由跳转

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

  3. Flutter实践:深入探索 flutter 中的状态管理方式(1)

    利用 Flutter 内置的许多控件我们可以打造出一款不仅漂亮而且完美跨平台的 App 外壳,我利用其特性完成了类似知乎App的UI界面,然而一款完整的应用程序显然不止有外壳这么简单.填充在外壳里面的 ...

  4. Flutter 中的基本路由

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

  5. Flutter之自定义路由切换动画

    Flutter之自定义路由切换动画 在Flutter中,我们可以通过Navigator来实现路由管理,包括路由的跳转和返回等.默认情况下,Flutter提供了一些简单的路由切换动画,但是有时候我们需要 ...

  6. 【Flutter】Flutter 调试 ( 调试回退功能 | Debug 调试中查看变量的方式 | 控制台信息 )

    文章目录 一.调试回退功能 二.Debug 调试中查看变量的方式 三.Debug 控制台信息 四.相关资源 一.调试回退功能 在调试过程中 , 经常错过关键位置的调试 , 如没有进入关键方法进行调试 ...

  7. Angular中实现路由跳转并通过get方式传递参数

    场景 Angular介绍.安装Angular Cli.创建Angular项目入门教程: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/detail ...

  8. vue 如何将参数放到连接上_通过Vue路由传参的两种方式及Vue组件中接收参数的方式...

    1. Vue传参方式 1.1 通过动态路由传参 我们经常需要把某种模式匹配到的所有路由,全都映射到同个组件.例如,我们有一个 User 组件,对于所有 ID 各不相同的用户,都要使用这个组件来渲染.那 ...

  9. SPA 中前端路由基本原理与实现方式

    SPA 前端路由原理与实现方式 通常 SPA 中前端路由有2中实现方式,本文会简单快速总结这两种方法及其实现: 修改 url 中 Hash 利用 H5 中的 history Hash 我们都知道 ur ...

最新文章

  1. 关于AI,腾讯又有大动作!开发者该如何应对?
  2. 一件代发系统php网站源码_靠谱礼品代发平台网站一件代发(0.5元)
  3. 中文通用百科知识图谱(CN-DBpedia)
  4. datagrid如何获取一行数据中的某个字段值_或许是全网最全面关于数据库面试题...
  5. 0909 学习操作系统
  6. ubuntu server 18.04 和 20.04 安装 RabbitMQ
  7. 百度前端技术学院---vue动态数据绑定-3
  8. 在全志平台调试博通的wifi驱动(类似ap6212)【转】
  9. diskgenius数据恢复软件,亲测可用!
  10. Allegro Pad Designer焊盘制作指南
  11. 围棋人机大战属于计算机在什么方面的应用,新华社评围棋人机大战:不怕电脑记性好 就怕爱学习...
  12. 看不见世界的程序员,开发了一款“吃鸡”
  13. 许远东受邀上海管理科技论坛做《LTD数字化经营方法论》分享
  14. js根据邮箱账号跳转登录邮箱地址
  15. 微信文章如何自动排版
  16. RF:Robot命令行工具帮助文件中文译版(个人翻译)
  17. javaFX学习之scene场景的概念
  18. [ 数据库原理 ] 函数依赖关系
  19. VSS2005局域网配置
  20. MATLAB初入门(一)

热门文章

  1. Acronis True Image 2021(最强数据备份与恢复软件)官方正式版V2021.39184 | acronistrueimage教程
  2. cout输出怎么控制几位小数_使用cout标准输出如何控制小数点后位数
  3. 实验4 图的应用问题 给定n个村庄之间的交通图,现计划在n个村庄中选定一个村庄建造一所医院,请设计方案解决问题
  4. 海尔启动“+AI Family”计划 携手共建人工智能新生态
  5. python语言是开源的现拥有十几万个第三方函数库_智慧树知到《Python程序设计基础》章节测试答案...
  6. C#学习教程12——Windows窗体应用程序
  7. jQuery 特效网址(特效大全)
  8. vue组件之间数据传递和通信方式总结
  9. 【SUMO学习】初级 Quick Start
  10. 【深度学习之美】“机器学习”三重门,“中庸之道”趋若人(入门系列之四)...