Flutter 中的命名路由

main.dart中配置路由

void main() {
runApp(MaterialApp(
theme: ThemeData(
appBarTheme: const AppBarTheme(
color: Colors.blue, // 设置导航栏颜色 (新版本的设置方法)
),
),
// home: Scaffold(body: MyFlutter1())
initialRoute: "/", //初始化路由
routes: {
"/": (contxt) => const MyFlutter1(),
"/form": (contxt) => const FormPage(),
// "/news": (contxt)=>const SearchMyApp(),
"/news": (contxt) {
return const SearchMyApp();
}, //类似
},
));
}

跳转路由

class TimePag extends StatefulWidget {
const TimePag({super.key}); @override
State<TimePag> createState() => _TimePagState();
}
class _TimePagState extends State<TimePag> {
@override
Widget build(BuildContext context) {
return Column(
children: [
ElevatedButton(
onPressed: () {
Navigator.pushNamed(context, "/news"); //命名路由跳转
},
child: const Text("命名路由跳转"))
],
);
}
}

Flutter 中的命名路由传值

配置onGenerateRoute

class MyApp1 extends StatelessWidget {
//1.配置路由
Map routes = {
"/": (contxt) => const MyFlutter1(),
"/form": (contxt) => const FormPage(),
// "/news": (contxt)=>const SearchMyApp(),
"/news": (contxt, {arguments}) {
return SearchMyApp(arguments: arguments); //命名路由传参
}, //类似
};
MyApp1({super.key}); @override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
appBarTheme: const AppBarTheme(
color: Colors.blue, // 设置导航栏颜色 (新版本的设置方法)
),
),
// home: Scaffold(body: MyFlutter1())
initialRoute: "/", //初始化路由
//2、调用onGenerateRoute处理(固定写法)
onGenerateRoute: (RouteSettings settings) {
// 统一处理
final String? name = settings.name; //获取命名路由的名称
final Function? pageContentBuilder = routes[name];
if (pageContentBuilder != null) {
if (settings.arguments != null) {
final Route route = MaterialPageRoute(
builder: (context) =>
pageContentBuilder(context, arguments: settings.arguments));
return route;
} else {
final Route route = MaterialPageRoute(
builder: (context) => pageContentBuilder(context));
return route;
}
}
return null;
},
);
}
}

定义页面接收arguments传参

//其他页面跳转到本页面进行传参
class SearchMyApp extends StatefulWidget { final Map arguments; const SearchMyApp({super.key,required this.arguments}); //必须传入 @override
State<SearchMyApp> createState() => _SearchMyAppState();
} class _SearchMyAppState extends State<SearchMyApp> { @override
void initState() {
super.initState();
print(widget.arguments); //参数
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("新闻页面"),
),
body: Center(child: Text("内容")),
);
}
}

跳转页面实现传参

class TimePag extends StatefulWidget {
const TimePag({super.key}); @override
State<TimePag> createState() => _TimePagState();
} class _TimePagState extends State<TimePag> {
@override
Widget build(BuildContext context) {
return Column(
children: [
ElevatedButton(
onPressed: () {
Navigator.pushNamed(context, "/news",
arguments: {"title": "我是命名路由传的值", "id": 5}); //命名路由跳转
},
child: const Text("命名路由跳转传值"))
],
);
}
}

Flutter 中的命名路由单独抽离到一个文件

新建routers/routers.dart 配置路由

import 'package:app_flutter01/pages/form.dart';
import 'package:app_flutter01/pages/news.dart';
import 'package:app_flutter01/pages/tabs.dart';
import 'package:flutter/material.dart'; //1.配置路由
Map routes = {
"/": (contxt) => const MyFlutter1(),
"/form": (contxt) => const FormPage(),
// "/news": (contxt)=>const SearchMyApp(),
"/news": (contxt, {arguments}) {
return SearchMyApp(arguments: arguments); //命名路由传参
}, //类似
}; // onGenerateRoute处理(固定写法) 这个方法也相当于一个中间件,这里可以做权限判断
var onGenerateRoute = (RouteSettings settings) {
// 统一处理
final String? name = settings.name; //获取命名路由的名称
final Function? pageContentBuilder = routes[name];
if (pageContentBuilder != null) {
if (settings.arguments != null) {
final Route route = MaterialPageRoute(
builder: (context) =>
pageContentBuilder(context, arguments: settings.arguments));
return route;
} else {
final Route route = MaterialPageRoute(
builder: (context) => pageContentBuilder(context));
return route;
}
}
return null;
};

修改main.dart

class MyApp1 extends StatelessWidget {
MyApp1({super.key}); @override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
appBarTheme: const AppBarTheme(
color: Colors.blue, // 设置导航栏颜色 (新版本的设置方法)
),
),
// home: Scaffold(body: MyFlutter1())
initialRoute: "/", //初始化路由
//2、调用onGenerateRoute处理(固定写法)
onGenerateRoute: onGenerateRoute,
);
}
}

实现页面跳转传值

class TimePag extends StatefulWidget {
const TimePag({super.key}); @override
State<TimePag> createState() => _TimePagState();
} class _TimePagState extends State<TimePag> {
@override
Widget build(BuildContext context) {
return Column(
children: [
ElevatedButton(
onPressed: () {
Navigator.pushNamed(context, "/news",
arguments: {"title": "我是命名路由传的值", "id": 5}); //命名路由跳转
},
child: const Text("命名路由跳转传值"))
],
);
}
}
Flutter 返回上一级路由
Navigator.of(context).pop();

Flutter 中替换路由

比如我们从用户中心页面跳转到了registerFirst页面,然后从registerFirst页面通过
pushReplacementNamed跳转到了registerSecond页面。这个时候当我们点击registerSecond的返回
按钮的时候它会直接返回到用户中心。
Navigator.of(context).pushReplacementNamed('/registerSecond');

Flutter 返回到根路由

比如我们从用户中心跳转到registerFirst页面,然后从registerFirst页面跳转到registerSecond页面,然
后从registerSecond跳转到了registerThird页面。这个时候我们想的是registerThird注册成功后返回到
用户中心。 这个时候就用到了返回到根路由的方法。
Navigator.of(context).pushAndRemoveUntil(
MaterialPageRoute(builder: (BuildContext context) {
return const Tabs();
}), (route) => false);

Flutter Android 和Ios使用同样风格的路由跳转

Material组件库中提供了一个MaterialPageRoute组件,它可以使用和平台风格一致的路由切换动画,
如在iOS上会左右滑动切换,而在Android上会上下滑动切换 , CupertinoPageRoute是Cupertino组件
库提供的iOS风格的路由切换组件如果在Android上也想使用左右切换风格,可以使用
CupertinoPageRoute。
import 'package:app_flutter01/pages/form.dart';
import 'package:app_flutter01/pages/news.dart';
import 'package:app_flutter01/pages/tabs.dart';
import 'package:flutter/material.dart'; //配置ios fen
import 'package:flutter/cupertino.dart'; /**
配置ios风格的路由
1、删掉material.dart引入
cupertino.dartimport 'package:flutter/cupertino.dart';
2、把MaterialPageRoute替换成CupertinoPageRoute
*/ //1.配置路由
Map routes = {
"/": (contxt) => const MyFlutter1(),
"/form": (contxt) => const FormPage(),
"/time": (contxt) => const MyFlutter1(), // "/news": (contxt)=>const SearchMyApp(),
"/news": (contxt, {arguments}) {
return SearchMyApp(arguments: arguments); //命名路由传参
}, //类似
}; // onGenerateRoute处理(固定写法) 这个方法也相当于一个中间件,这里可以做权限判断
var onGenerateRoute = (RouteSettings settings) {
// 统一处理
final String? name = settings.name; //获取命名路由的名称
final Function? pageContentBuilder = routes[name];
if (pageContentBuilder != null) {
if (settings.arguments != null) {
// final Route route = MaterialPageRoute( //路由效果
final Route route = CupertinoPageRoute(
builder: (context) =>
pageContentBuilder(context, arguments: settings.arguments));
return route;
} else {
final Route route =
MaterialPageRoute(builder: (context) => pageContentBuilder(context));
return route;
}
}
return null;
};

全局配置主题

return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
appBarTheme: const AppBarTheme(
centerTitle: true, //标题居中
)
),
initialRoute: "/",
onGenerateRoute: onGenerateRoute,
);

命名路由跳转设置过度动画

//routers.dart 文件里直接加
class BackgroundPageRoute extends PageRouteBuilder {
final WidgetBuilder builder; BackgroundPageRoute({required this.builder})
: super(
pageBuilder: (context, animation, secondaryAnimation) => builder(context),
transitionsBuilder: (context, animation, secondaryAnimation, child) {
return Stack(
children: [
Positioned.fill(
child: Image.network(
'url',
fit: BoxFit.cover,
),
),
FadeTransition(
opacity: animation,
child: child,
),
],
);
},
);
} //单个使用(需要跳转的页面里) Navigator.push(
context,
BackgroundPageRoute(
builder: (context) => FormPage(),
),
); //全局使用(在routers.dart 里)
将final Route route = MaterialPageRoute( ....
换成 final Route route = BackgroundPageRoute( //使用BackgroundPageRoute ....

26、Flutter中命名路由的更多相关文章

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

    原文地址:https://www.jianshu.com/p/5df089d360e4 本文首先讲的Flutter中的路由,然后主要讲下Flutter中栈管理的几种方法. 了解下Route和Navig ...

  2. Flutter 中的路由

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

  3. Flutter中的路由 路由替换 返回到根路由

    一.Flutter 中返回到上一级页面 Navigator.of(context).pop(); 二.Flutter 中替换路由 比如我们从用户中心页面跳转到了 registerFirst 页面,然后 ...

  4. flutter中的路由跳转

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

  5. tornado中命名路由及反向解析使用

    一. 命名路由: 通常路由写法为[ (r'/' , Handler), ... ] 以上路由写法无法实现命名, 使用命名路由需借助tornado提供的方法, 如下: [ tornado.web.url ...

  6. Flutter中的普通路由与命名路由(Navigator组件)

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

  7. Flutter 中的普通路由、普通路由传值、 命名路由、命名路由传值

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

  8. Flutter 中的基本路由

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

  9. 16Flutter中的路由 基本路由 基本路由跳转传值(上)

    /* Flutter中的普通路由.普通路由传值.命名路由.命名路由传值 Flutter中的路由通俗的讲就是页面跳转.在Flutter中通过Navigator组件管理路由导航. 并提供了管理堆栈的方法. ...

  10. flutter中的命名路由

    命名路由是区别于基本路由的一种存在,方便于大型项目中路由的统一管理,现在,在前面基本路由的项目基础上实现实现命名路由. 使用步骤 路由配置 命名路由在使用前,需要在根组件main.dart中进行简单的 ...

随机推荐

  1. Go方法特性详解:简单性和高效性的充分体现

    本文深入探讨了Go语言中方法的各个方面,包括基础概念.定义与声明.特性.实战应用以及性能考量.文章充满技术深度,通过实例和代码演示,力图帮助读者全面理解Go方法的设计哲学和最佳实践. 关注[TechL ...

  2. ansible-playbook应用

    ansible-playbook剧本: 如上使用Ad-hoc方式点对点命令执行,可以管理远程主机,如果服务器数量很多,配置信息比较多,还可以利用ansible playbook编写剧本.从而以非常简单 ...

  3. JavaScript:垃圾收集机制

    JavaScript具有自动垃圾收集机制.也就是说,执行环境会负责管理代码执行过程中使用的内存.开发人员不必关心内存分配和回收问题. 垃圾收集机制的原理:找到不再继续使用的变量,然后进行释放其占用的内 ...

  4. 一个Docker仓库问题的思考

    近期项目有云上部署要求,产品要打包成docker镜像.之前产品已经发布过docker版本本次只需要需要更新下,于是交代组内另外一个同学更新下镜像,想着应该很简单: 中间经过熟悉docker知识点搭建环 ...

  5. 【re】[NISACTF 2022]string --linux下的随机数

    附件下载,查壳 发现是ELF程序,64位,ida打开分析 flag函数点进去 前面一堆代码其实都不重要,直接看主要代码:  puts("The length of flag is 13&qu ...

  6. L3-011 直捣黄龙

    #include<bits/stdc++.h> using namespace std; using pii = pair<int, int>; const int N = 3 ...

  7. 按既定顺序创建目标数组 (leetcode181周赛T1)

    给你两个整数数组 nums 和 index.你需要按照以下规则创建目标数组: 目标数组 target 最初为空. 按从左到右的顺序依次读取 nums[i] 和 index[i],在 target 数组 ...

  8. 【算法】状态之美,TCP/IP状态转换探索

    最近城市里甲流肆虐,口罩已经成为了出门必备的物品.小悦也不得不开始采取防护措施,上下班过程中,将口罩戴起来以保护自己不受病毒的侵害. 每天下班后,小悦总是喜欢投入到自己的兴趣爱好中,她热衷于翻阅与IT ...

  9. 华为ar502H物联网边缘计算网关,在容器内控制/dev/do0开关命令

    执行以下命令进行开关do继电开关,可以听见电位器声音. echo -en  "\x01" > /dev/do0 echo -en  "\x00" > ...

  10. jmeter-json断言

    1.JSON 断言所在位置:断言->JSON 断言 2.JSON断言中的字段解析 Assert JSON Path exists:json 表达式,判断所字段是否存在,存在则为True, 否则为 ...