Flutter
Flutter开发笔记:路由技能
– 文章信息 –Author: Jack Lee (jcLee95)
Visit me at: jclee95.blog.csdn.net
Email: 291148484@163.com.
Shenzhen China
Address of this article:blog.csdn.net/qq_28550263…
【介绍】:本文介绍 Flutter 路由的原理,以及 go_router 模块的用法。
下一节:《
实战案例:运用go_router构建一个移动端音乐运用
》
@[TOC](
目 录
)
1. 概述
1.1 移动端路由简介
移动端运用开发中,路由技能是一个十分重要的组成部分。路由技能担任办理运用中各个页面之间的跳转、导航以及参数传递等要害功用。在移动端运用中,一个高效、易于保护的路由体系关于进步开发效率和用户体会具有重要意义。
1.2 本文内容导航
本文将对 Flutter 移动端运用开发中的路由技能进行具体解说,内容涵盖以下几个方面:
- Flutter 路由基础知识,包括中心概念、根本操作以及传参等;
- 命名路由与动态路由的界说、运用以及比照;
-
go_router
模块的介绍,包括装置、装备、界说和注册路由等; - 运用
go_router
完成页面导航、处理深度链接、重定向等高档功用; - 路由护卫与路由过渡动画的完成;
- 经过实战案例,展现怎么运用
go_router
构建一个完整的移动端运用。
经过学习本文,能够把握 Flutter 路由技能的根本原理和实践办法,为开发高质量的移动端运用奠定坚实基础。
2. Flutter 路由基础
2.1 路由的中心:Route 和 Navigator
在 Flutter 中,路由技能的中心概念包括两个要素:Route 和 Navigator。
2.1.1 Route
Route 代表运用中的一个页面,它包括了页面的布局、逻辑以及生命周期等信息。在 Flutter 中,Route一般是一个继承自PageRoute
的类。
PageRoute
是一个抽象类,表明一个能够用于Navigator
的页面。它包括了页面的构建办法、过渡动画以及页面的生命周期回调等特点。在实践开发中,咱们一般会运用以下两种PageRoute:MaterialPageRoute
或CupertinoPageRoute
:
-
MaterialPageRoute
:一个完成了Material Design风格的页面路由,它供给了渠道特定的页面切换动画。在Android设备上,页面从底部滑入;在iOS设备上,页面从右侧滑入。如:// 运用MaterialPageRoute创立一个新页面 MaterialPageRoute(builder: (context) => NewPage());
-
CupertinoPageRoute
:一个完成了Cupertino风格(iOS风格)的页面路由,它供给了iOS渠道特定的页面切换动画。如:// 运用CupertinoPageRoute创立一个新页面 CupertinoPageRoute(builder: (context) => NewPage());
2.1.2 Navigator(导航器)
在 Flutter 中,路由技能的别的一个中心概念是 Navigator。Navigator 是一个办理运用页面栈的组件,它担任处理页面之间的跳转、导航以及参数传递等操作。在 Flutter 中,Navigator类是一个要害的组件,它供给了一系列办法来完成页面间的导航
Navigator 是一个办理运用页面栈的组件,它担任处理页面之间的跳转、导航以及参数传递等操作。它经过一个栈结构来办理运用中的页面。当一个新页面被翻开时,它会被压入栈顶;当一个页面被关闭时,它会从栈顶弹出。经过对栈的操作,Navigator完成了页面间的跳转和导航。
Navigator 类是一个要害的组件,它供给了一系列办法来完成页面间的导航。包括:
办法 | 描绘 |
---|---|
push |
将一个新的页面压入栈顶,完成从当时页面跳转到新页面的功用。 |
pop |
将栈顶的页面弹出,完成从当时页面回来到上一个页面的功用。 |
replace |
将栈中的某个页面替换为新的页面。 |
pushAndRemoveUntil |
将一个新的页面压入栈顶,并移除栈中指定条件的页面。 |
pushNamed |
经过页面的称号进行跳转。 |
popAndPushNamed |
弹出当时页面并跳转到指定称号的页面。 |
为了在运用中运用Navigator
,咱们需求将其增加到运用的组件树中。在实践开发中,咱们一般会在MaterialApp 或 CupertinoApp 组件中装备 Navigator。
// 装备Navigator
MaterialApp(
home: HomePage(),
navigatorKey: GlobalKey<NavigatorState>(),
);
接下来,咱们能够经过BuildContext来获取NavigatorState方针,进而进行页面间的导航操作。
// 运用push办法跳转到新页面
Navigator.of(context).push(MaterialPageRoute(builder: (context) => NewPage()));
// 运用pop办法回来上一个页面
Navigator.of(context).pop();
2.1.3 小结
本节经过了解Route和Navigator的中心概念、用法以及代码示例,您能够更好地了解和运用 Flutter 中的路由技能。在接下来的章节中,咱们将持续深化解说 Flutter 路由的其他知识点。
2.2 页面间导航的根本操作
在本节中,咱们将介绍怎么在 Flutter 运用中完成页面间的导航操作,包括页面的跳转、回来以及传递参数等。咱们将别离解说这些操作的原理、用法以及具体的代码示例。
2.2.1 页面跳转
页面跳转是指从当时页面导航到另一个页面的进程。在 Flutter 中,咱们能够运用Navigator.push
办法将一个新的页面压入栈顶,然后完成页面跳转的功用。
页面跳转的首要过程如下:
- 界说新页面的
Route
方针,如MaterialPageRoute
或CupertinoPageRoute
。 - 运用
Navigator.push
办法跳转到新页面。
例如:
// 界说新页面的Route方针
MaterialPageRoute newPageRoute = MaterialPageRoute(builder: (context) => NewPage());
// 运用Navigator.push办法跳转到新页面
Navigator.of(context).push(newPageRoute);
经过Navigator.push
办法,咱们能够完成从当时页面跳转到新页面的功用。在实践开发中,咱们一般会运用MaterialPageRoute
或CupertinoPageRoute
来创立新页面的Route方针。
2.2.2 页面回来
页面回来是指从当时页面回来到上一个页面的进程。在 Flutter 中,咱们能够运用 Navigator.pop
办法将栈顶的页面弹出,然后完成页面回来的功用。
页面回来的首要过程如下:
- 运用
Navigator.pop
办法回来上一个页面。
// 运用Navigator.pop办法回来上一个页面
Navigator.of(context).pop();
经过Navigator.pop
办法,咱们能够完成从当时页面回来到上一个页面的功用。在实践开发中,咱们一般会在页面的回来按钮或许手势操作中调用Navigator.pop
办法来完成页面回来。
2.2.3 页面替换
页面替换是指将栈顶的页面替换为一个新的页面。在 Flutter 中,咱们能够运用Navigator.replace办法完成这个功用。
要运用页面替换功用,首要需求界说新页面的Route方针。然后调用Navigator.replace办法,传入BuildContext、新Route方针以及要替换的Route方针的标识符作为参数。
例如:
// 界说新页面的Route方针
MaterialPageRoute newPageRoute = MaterialPageRoute(builder: (context) => NewPage());
// 运用Navigator.replace办法替换栈顶的页面
Navigator.of(context).replace(
oldRoute: ModalRoute.of(context)!,
newRoute: newPageRoute,
);
2.2.4 页面移除
页面移除是指将指定的页面从导航仓库中移除。在 Flutter 中,咱们能够运用 Navigator.removeRoute 办法完成这个功用。
要运用页面移除功用,首要需求获取要移除的页面的Route方针。然后调用 Navigator.removeRoute 办法,传入 BuildContext 和要移除的Route方针作为参数。
以下是一个具体的代码示例:
// 获取要移除的页面的Route方针
Route routeToRemove = ModalRoute.of(context)!;
// 运用Navigator.removeRoute办法移除指定页面
Navigator.of(context).removeRoute(routeToRemove);
2.2.5 小结
本节具体解说了 Flutter 中页面间导航的根本操作,包括页面跳转、页面回来、页面替换和页面移除等。经过了解这些操作的原理、用法和代码示例,您能够更好地了解和运用 Flutter 中的页面间导航操作。在接下来的章节中,咱们将持续深化解说 Flutter 路由的其他知识点。
2.3 路由传参加接纳参数
在本节中,咱们将介绍怎么在 Flutter 运用中完成路由传参以及接纳参数的办法。咱们将依照原理、用法和代码示例的次序,别离解说这些操作的具体内容。
2.3.1 路由传参
路由传参是指在跳转到新页面时,将参数传递给新页面,以便新页面依据参数进行相应的操作。在 Flutter 中,咱们能够在创立新页面的Route
方针时,将参数传递给新页面的结构函数。
以下是一个具体的代码示例:
class NewPage extends StatelessWidget {
final String data;
NewPage({required this.data});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('New Page'),
),
body: Center(
child: Text('Data received: $data'),
),
);
}
}
// 在跳转时传递参数
MaterialPageRoute newPageRoute = MaterialPageRoute(builder: (context) => NewPage(data: 'Hello, Flutter!'));
Navigator.of(context).push(newPageRoute);
2.3.2 接纳参数
接纳参数是指在新页面中获取传递过来的参数,并依据参数进行相应的操作。在 Flutter 中,咱们能够在新页面的结构函数中接纳传递过来的参数。
以下是一个具体的代码示例:
class NewPage extends StatelessWidget {
final String data;
NewPage({required this.data});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('New Page'),
),
body: Center(
child: Text('Data received: $data'),
),
);
}
}
2.3.3 回来参数
回来参数是指在回来上一个页面时,将参数传递回上一个页面。在 Flutter 中,咱们能够在调用Navigator.pop
办法时,将参数作为办法的第二个参数传递。
以下是一个具体的代码示例:
// 在回来上一个页面时传递参数
Navigator.of(context).pop('Hello, Flutter!');
2.3.4 接纳回来参数
接纳回来参数是指在上一个页面中获取回来的参数,并依据参数进行相应的操作。在 Flutter 中,咱们能够在调用Navigator.push
办法时,经过then
办法获取回来的参数。
以下是一个具体的代码示例:
MaterialPageRoute newPageRoute = MaterialPageRoute(builder: (context) => NewPage());
Navigator.of(context).push(newPageRoute).then((result) {
print('Data returned: $result');
});
2.3.5 小结
本节具体解说了 Flutter 中路由传参加接纳参数的办法,包括路由传参、接纳参数、回来参数和接纳回来参数等。经过了解这些操作的原理、用法和代码示例,您能够更好地了解和运用 Flutter 中的路由传参加接纳参数。在接下来的章节中,咱们将持续深化解说 Flutter 路由的其他知识点。
3. 命名路由与动态路由
3.1 命名路由的界说与运用
在本节中,咱们将介绍怎么在 Flutter 运用中界说和运用命名路由(静态路由)。咱们将依照原理、用法和代码示例的次序,别离解说这些操作的具体内容。
3.1.1 命名路由的界说
命名路由是指为每个路由分配一个称号,以便在进行页面跳转时运用称号来引证路由。在 Flutter 中,咱们能够在MaterialApp
或CupertinoApp
的routes
特点中界说命名路由。
以下是一个具体的代码示例:
MaterialApp(
initialRoute: '/',
routes: {
'/': (context) => HomePage(),
'/new': (context) => NewPage(),
},
);
3.1.2 运用命名路由进行页面跳转
运用命名路由进行页面跳转是指在跳转到新页面时,经过路由称号来引证新页面。在 Flutter 中,咱们能够运用Navigator.pushNamed
办法进行页面跳转,传入BuildContext和路由称号作为参数。
以下是一个具体的代码示例:
// 运用Navigator.pushNamed办法跳转到新页面
Navigator.of(context).pushNamed('/new');
3.1.3 运用命名路由进行页面回来
运用命名路由进行页面回来是指在回来上一个页面时,经过路由称号来引证上一个页面。在 Flutter 中,咱们能够运用Navigator.popAndPushNamed
办法进行页面回来,传入BuildContext和路由称号作为参数。
以下是一个具体的代码示例:
// 运用Navigator.popAndPushNamed办法回来上一个页面
Navigator.of(context).popAndPushNamed('/');
3.1.4 运用命名路由进行页面替换
运用命名路由进行页面替换是指在替换栈顶的页面时,经过路由称号来引证新页面。在 Flutter 中,咱们能够运用Navigator.pushReplacementNamed
办法进行页面替换,传入BuildContext和路由称号作为参数。
以下是一个具体的代码示例:
// 运用Navigator.pushReplacementNamed办法替换栈顶的页面
Navigator.of(context).pushReplacementNamed('/new');
3.1.5 小结
本节具体解说了命名路由(静态路由)的界说与运用,包括命名路由的界说、运用命名路由进行页面跳转、页面回来和页面替换等。经过了解这些操作的原理、用法和代码示例,您能够更好地了解和运用 Flutter 中的命名路由(静态路由)。在接下来的章节中,咱们将持续深化解说 Flutter 路由的其他知识点,包括动态路由的界说与运用。
3.2 动态路由的界说与运用
在本节中,咱们将介绍怎么在 Flutter 运用中界说和运用动态路由。咱们将依照原理、用法和代码示例的次序,别离解说这些操作的具体内容。
3.2.1 动态路由的界说
动态路由是指在进行页面跳转时,依据传入的参数生成路由。与命名路由比较,动态路由愈加灵敏,能够依据需求生成不同的路由。在 Flutter 中,咱们能够经过MaterialApp
或CupertinoApp
的onGenerateRoute
特点来界说动态路由。
以下是一个具体的代码示例:
MaterialApp(
initialRoute: '/',
onGenerateRoute: (settings) {
switch (settings.name) {
case '/':
return MaterialPageRoute(builder: (context) => HomePage());
case '/new':
final String data = settings.arguments as String;
return MaterialPageRoute(builder: (context) => NewPage(data: data));
default:
return MaterialPageRoute(builder: (context) => NotFoundPage());
}
},
);
3.2.2 运用动态路由进行页面跳转
运用动态路由进行页面跳转是指在跳转到新页面时,经过传递参数来生成新页面的路由。在 Flutter 中,咱们能够运用Navigator.pushNamed
办法进行页面跳转,传入BuildContext、路由称号和参数作为参数。
以下是一个具体的代码示例:
// 运用Navigator.pushNamed办法跳转到新页面,并传递参数
Navigator.of(context).pushNamed('/new', arguments: 'Hello, Flutter!');
3.2.3 运用动态路由进行页面回来
运用动态路由进行页面回来是指在回来上一个页面时,经过传递参数来生成上一个页面的路由。在 Flutter 中,咱们能够运用Navigator.popAndPushNamed
办法进行页面回来,传入BuildContext、路由称号和参数作为参数。
以下是一个具体的代码示例:
// 运用Navigator.popAndPushNamed办法回来上一个页面,并传递参数
Navigator.of(context).popAndPushNamed('/', arguments: 'Hello, Flutter!');
3.2.4 运用动态路由进行页面替换
运用动态路由进行页面替换是指在替换栈顶的页面时,经过传递参数来生成新页面的路由。在 Flutter 中,咱们能够运用Navigator.pushReplacementNamed
办法进行页面替换,传入BuildContext、路由称号和参数作为参数。
以下是一个具体的代码示例:
// 运用Navigator.pushReplacementNamed办法替换栈顶的页面,并传递参数
Navigator.of(context).pushReplacementNamed('/new', arguments: 'Hello, Flutter!');
3.1.5 小结
本节具体解说了动态路由的界说与运用,包括动态路由的界说、运用动态路由进行页面跳转、页面回来和页面替换等。经过了解这些操作的原理、用法和代码示例,您能够更好地了解和运用 Flutter 中的动态路由。在接下来的章节中,咱们将持续深化解说 Flutter 路由的其他知识点,以帮助您更好地把握 Flutter 路由的运用办法。
3.3 命名路由 与 动态路由 的比较
在本节中,咱们将比照命名路由和动态路由的特点,以及它们各自适用的场景。经过比照分析,您将更好地了解这两种路由办法的差异,然后在实践项目中挑选更合适的路由办法。
3.3.1 命名路由与动态路由的比照
下面是命名路由和动态路由的比照:
-
界说办法:命名路由经过
MaterialApp
或CupertinoApp
的routes
特点界说,而动态路由经过onGenerateRoute
特点界说。 -
参数传递:命名路由在进行页面跳转时,需求将参数界说在路由称号中,而动态路由能够经过
arguments
特点直接传递参数。 - 灵敏性:动态路由比较于命名路由愈加灵敏,由于它能够依据传入的参数动态生成路由,而命名路由需求预先界说好一切的路由称号。
- 易用性:关于简略的页面跳转,命名路由愈加易用,由于它只需求预先界说好路由称号即可。然而,在需求依据参数动态生成路由的场景下,动态路由愈加便利。
3.3.2 适用场景
下面是命名路由和动态路由各自适用的场景:
- 命名路由:适用于简略的页面跳转,无需依据参数动态生成路由的场景。例如,从主页跳转到关于页面,或从商品列表页跳转到商品详情页等。
- 动态路由:适用于需求依据参数动态生成路由的场景。例如,从用户列表页跳转到用户详情页时,需求依据用户ID生成不同的用户详情页面;或许在一个新闻运用中,依据不同的新闻类别生成不同的新闻列表页面等。
3.3.3 小结
本节经过比照命名路由和动态路由的特点,以及它们各自适用的场景,帮助您更好地了解这两种路由办法的差异。在实践项目中,您能够依据具体需求挑选合适的路由办法。总的来说,关于简略的页面跳转,命名路由愈加易用;而在需求依据参数动态生成路由的场景下,动态路由愈加便利。
在接下来的章节中,咱们将持续深化解说 Flutter 路由的其他知识点,以帮助您更好地把握 Flutter 路由的运用办法。
4. go_router 模块介绍
4.1 go_router 模块的特点
在本节中,咱们将介绍 go_router
模块的优势与特点。go_router
是一个用于 Flutter 的路由库,它供给了一种简练、强壮且易于保护的路由办理办法。
解go_router
模块有以下优势:
-
类型安全:
go_router
模块支撑类型安全的路由参数传递,能够有效地削减因参数类型过错而导致的运行时过错。 -
代码简练:
go_router
模块选用声明式的编程办法,能够让您的代码愈加简练、易读和易于保护。 -
功用丰富:
go_router
模块供给了多种路由功用,包括命名路由、动态路由、路由护卫、路由重定向等,能够满足各种杂乱场景的需求。 -
与现有结构兼容:
go_router
模块与其他 Flutter 结构(如Provider、Riverpod、GetX等)兼容良好,能够便利地集成到您的项目中。
从功用上上看, go_router
模块有以下特点:
-
命名路由:
go_router
模块支撑命名路由,能够让您更便利地办理和跳转到指定页面。 -
动态路由:
go_router
模块支撑动态路由,能够依据传入的参数生成不同的路由,适用于需求依据参数动态生成路由的场景。 -
路由护卫:
go_router
模块支撑路由护卫,能够在路由跳转进程中增加条件判别,例如进行身份验证、权限查看等。 -
路由重定向:
go_router
模块支撑路由重定向,能够依据需求将用户从一个路由重定向到另一个路由。 -
浏览器支撑:
go_router
模块支撑 Flutter Web运用,能够在浏览器中运用URL进行页面跳转。
4.2 装置与装备 go_router 模块
在本节中,咱们将介绍怎么装置和装备go_router
模块。经过以下过程,您能够将go_router
模块增加到您的 Flutter 项目中,并进行根本的装备。
4.2.1 增加依靠
首要,在您的 Flutter 项目的pubspec.yaml
文件中,增加go_router
模块的依靠。您能够在pub.dev上查找到go_router
模块的最新版本。以下是一个增加依靠的示例:
dependencies:
flutter:
sdk: flutter
go_router: ^2.4.2
增加依靠后,运行flutter pub get
指令以下载并装置go_router
模块。
4.2.2 导入 go_router 模块
在需求运用go_router
模块的文件中,导入go_router
模块:
import 'package:go_router/go_router.dart';
4.2.3 界说路由
接下来,界说您的项目中需求运用的路由。创立一个GoRoute
方针的列表,每个GoRoute
方针代表一个路由。以下是一个界说路由的示例:
final goRoutes = [
GoRoute(
path: '/',
pageBuilder: (context, state) {
return MaterialPage(child: HomePage());
}),
GoRoute(
path: '/details/:id',
pageBuilder: (context, state) {
final id = state.params['id'];
return MaterialPage(child: DetailsPage(id: id));
}),
];
在此示例中,咱们界说了两个路由:一个是主页(/
),另一个是详情页(/details/:id
)。详情页的路由途径包括一个动态参数id
。
4.2.4 初始化 GoRouter 方针
创立一个GoRouter
方针,并将之前界说的路由列表传递给它:
final goRouter = GoRouter(routes: goRoutes);
4.2.5 装备 MaterialApp 或 CupertinoApp
将GoRouter
方针传递给MaterialApp.router
或CupertinoApp.router
特点。以下是一个装备MaterialApp
的示例:
MaterialApp.router(
routerDelegate: goRouter.routerDelegate,
routeInformationParser: goRouter.routeInformationParser,
);
4.2.6 小结
本节介绍了怎么装置和装备go_router
模块。经过增加依靠、导入模块、界说路由、初始化GoRouter方针和装备MaterialApp或CupertinoApp,您能够将go_router
模块集成到您的 Flutter 项目中。在接下来的章节中,咱们将持续深化解说go_router
模块的运用办法,包括怎么进行页面跳转、传递参数、运用路由护卫等。
4.3 界说和注册路由
在本节中,咱们将具体介绍怎么界说和注册go_router
模块中的路由。经过以下过程,您能够在您的 Flutter 项目中创立和运用go_router
模块的路由。
4.3.1 界说路由
如前文所述,您需求创立一个GoRoute
方针的列表来界说路由。每个GoRoute
方针都需求包括以下特点:
-
path
:路由途径,能够包括动态参数(如/details/:id
)。 -
pageBuilder
:页面构建器,接纳一个BuildContext和GoRouterState方针,回来一个Page方针。您能够在此处创立并回来您的页面(如MaterialPage
、CupertinoPage
等)。
以下是一个界说路由的示例:
final goRoutes = [
GoRoute(
path: '/',
pageBuilder: (context, state) {
return MaterialPage(child: HomePage());
}),
GoRoute(
path: '/details/:id',
pageBuilder: (context, state) {
final id = state.params['id'];
return MaterialPage(child: DetailsPage(id: id));
}),
];
4.3.2 注册路由
在界说了路由列表后,您需求创立一个GoRouter
方针,并将路由列表传递给它。这样,您的路由就会被注册到go_router
模块中:
final goRouter = GoRouter(routes: goRoutes);
4.3.3 运用命名路由
为了更便利地办理和运用路由,您能够为每个路由增加一个name
特点。这样,您能够经过路由称号来跳转到指定页面,而无需记住路由途径。以下是一个运用命名路由的示例:
final goRoutes = [
GoRoute(
path: '/',
name: 'home',
pageBuilder: (context, state) {
return MaterialPage(child: HomePage());
}),
GoRoute(
path: '/details/:id',
name: 'details',
pageBuilder: (context, state) {
final id = state.params['id'];
return MaterialPage(child: DetailsPage(id: id));
}),
];
在为路由增加了称号后,您能够运用GoRouter
方针的goNamed
办法来跳转到指定页面:
goRouter.goNamed(context, 'details', params: {'id': '123'});
4.3.4 小结
本节具体介绍了怎么界说和注册go_router
模块中的路由。经过创立GoRoute
方针的列表、为路由增加称号和运用GoRouter
方针的办法,您能够在您的 Flutter 项目中轻松地创立和运用go_router
模块的路由。在接下来的章节中,咱们将持续深化解说go_router
模块的运用办法,包括怎么进行页面跳转、传递参数、运用路由护卫等。
5. 运用 go_router 完成页面导航
5.1 依据URL的导航
在本节中,咱们将介绍怎么运用go_router
模块完成依据URL的页面导航。经过以下过程,您能够在您的 Flutter 项目中运用go_router
模块进行页面跳转和参数传递。
5.1.1 页面跳转
运用go_router
模块进行页面跳转十分简略。您只需调用GoRouter
方针的go
办法,并传入当时的BuildContext
和方针页面的URL。以下是一个页面跳转的示例:
goRouter.go(context, '/details/123');
在此示例中,咱们跳转到了/details/123
途径对应的页面。
5.1.2 传递参数
go_router
模块答应您经过URL直接传递参数给方针页面。在界说路由时,您能够在途径中增加动态参数,如/details/:id
。然后,在页面跳转时,将参数值直接填充到途径中,如/details/123
。
在方针页面的pageBuilder
办法中,您能够经过GoRouterState
方针的params
特点获取传递的参数值。以下是一个获取参数值的示例:
final id = state.params['id'];
5.1.3 运用命名路由
如前文所述,您能够为路由增加称号,以便更便利地进行页面跳转。在为路由增加了称号后,您能够运用GoRouter
方针的goNamed
办法来跳转到指定页面,并传递参数:
goRouter.goNamed(context, 'details', params: {'id': '123'});
在此示例中,咱们跳转到了称号为details
的路由对应的页面,并传递了一个id
参数。
5.1.4 小结
本节介绍了怎么运用 go_router
模块完成依据 URL 的页面导航。经过调用GoRouter
方针的go
或goNamed
办法,您能够在您的 Flutter 项目中轻松地进行页面跳转和参数传递。在接下来的章节中,咱们将持续深化解说 go_router
模块的运用办法,包括怎么运用路由护卫、处理页面过渡动画等。
5.2 运用GoRouter类进行导航
在本节中,咱们将介绍怎么运用GoRouter
类供给的办法进行页面导航。GoRouter
类供给了一系列便捷的办法,使得在 Flutter 项目中进行页面跳转和参数传递变得愈加简略。
5.2.1 运用 go 办法进行导航
GoRouter
类的go
办法答应您经过URL进行页面导航。您只需传入当时的BuildContext
和方针页面的URL即可。以下是一个运用go
办法进行页面跳转的示例:
goRouter.go(context, '/details/123');
在此示例中,咱们跳转到了/details/123
途径对应的页面。
5.2.2 运用 goNamed 办法进行导航
GoRouter
类的goNamed
办法答应您经过路由称号进行页面导航。您需求传入当时的BuildContext
、方针页面的路由称号以及一个可选的参数映射。以下是一个运用goNamed
办法进行页面跳转的示例:
goRouter.goNamed(context, 'details', params: {'id': '123'});
在此示例中,咱们跳转到了称号为details
的路由对应的页面,并传递了一个id
参数。
5.2.3 运用 goBack 办法回来上一页
GoRouter
类的goBack
办法答应您回来上一页。您只需传入当时的BuildContext
即可。以下是一个运用goBack
办法回来上一页的示例:
goRouter.goBack(context);
5.2.4 运用 goTo 办法跳转到指定页面
GoRouter
类的goTo
办法答应您跳转到指定页面。您需求传入当时的BuildContext
、一个GoRouteMatch
方针以及一个可选的参数映射。以下是一个运用goTo
办法跳转到指定页面的示例:
final match = goRouter.match('/details/123');
goRouter.goTo(context, match, params: {'id': '123'});
在此示例中,咱们首要运用match
办法获取与URL对应的GoRouteMatch
方针,然后运用goTo
办法跳转到指定页面,并传递了一个id
参数。
5.2.5 小结
本节介绍了怎么运用GoRouter
类进行页面导航。经过调用GoRouter
类的go
、goNamed
、goBack
和goTo
办法,您能够在您的 Flutter 项目中轻松地进行页面跳转和参数传递。在接下来的章节中,咱们将持续深化解说go_router
模块的运用办法,包括怎么运用路由护卫、处理页面过渡动画等。
5.3 页面间传参加接纳参数
在运用go_router
进行页面导航时,您可能需求在页面间传递参数。本节将介绍怎么在运用go_router
进行页面跳转时传递参数,并在方针页面中接纳这些参数。
5.3.1 在页面跳转时传递参数
要在页面跳转时传递参数,您能够在URL中直接增加动态参数,或许运用命名路由时经过params
参数传递。以下是两种传递参数的示例:
经过URL传递参数:
goRouter.go(context, '/details/123');
在此示例中,咱们将123
作为参数传递给了/details/123
途径对应的页面。
经过命名路由传递参数:
goRouter.goNamed(context, 'details', params: {'id': '123'});
在此示例中,咱们运用命名路由跳转到details
页面,并经过params
参数传递了一个id
参数。
5.3.2 在方针页面接纳参数
要在方针页面接纳参数,您能够在pageBuilder
办法中经过GoRouterState
方针的params
特点获取传递的参数值。以下是一个在方针页面接纳参数的示例:
final id = state.params['id'];
在此示例中,咱们从state.params
中获取了名为id
的参数值。
5.3.3 运用类型安全的办法传递参数
为了防止在传递参数时呈现类型过错,您能够运用GoRoute
的paramsBuilder
特点界说一个类型安全的参数构建器。以下是一个界说类型安全参数构建器的示例:
GoRoute(
path: '/details/:id',
pageBuilder: (context, state) {
final id = state.params['id'];
return MaterialPage(child: DetailsPage(id: id));
},
paramsBuilder: (params) {
final id = params['id'];
if (id == null) throw Exception('id is required');
return {'id': int.parse(id)};
},
)
在此示例中,咱们为GoRoute
界说了一个paramsBuilder
,它将id
参数从字符串转换为整数。这样,在pageBuilder
中,咱们能够直接运用类型安全的id
参数。
5.3.5 小结
本节介绍了怎么在运用go_router
进行页面导航时传递参数以及在方针页面中接纳这些参数。经过在URL中增加动态参数或许运用命名路由时传递params
参数,您能够轻松地在页面间传递参数。一起,您还能够运用GoRoute
的paramsBuilder
特点界说类型安全的参数构建器,以防止在传递参数时呈现类型过错。在接下来的章节中,咱们将持续深化解说go_router
模块的运用办法,包括怎么运用路由护卫、处理页面过渡动画等。
6. 处理深度链接与重定向
6.1 深度链接的概念与运用
深度链接(Deep Linking)是一种答运用户直接翻开运用内特定页面的技能。经过深度链接,您能够将用户从网页、广告、电子邮件或其他运用直接导航到您的运用的特定页面,而不仅仅是运用的主页面。这有助于进步用户体会,增加用户参加度,并进步运用的转化率。
在本节中,咱们将介绍深度链接的概念,以及怎么在运用go_router
模块的 Flutter 运用中处理深度链接。
6.1.1 深度链接的类型
深度链接首要分为两种类型:
-
普通深度链接(Standard Deep Links):这种类型的深度链接运用标准的URL格式,例如
https://example.com/details/123
。当用户点击此类链接时,运用会测验翻开对应的页面。假如运用没有装置,用户将被重定向到运用商店。 - 通用链接(Universal Links):通用链接是一种特别类型的深度链接,它答应您为一个URL创立一个唯一的相关。当用户点击通用链接时,体系会依据相关信息自动判别是否翻开运用或许网页。通用链接在iOS和Android渠道上别离称为“通用链接(Universal Links)”和“运用链接(App Links)”。
6.1.2 在 Flutter 运用中处理深度链接
要在 Flutter 运用中处理深度链接,您需求运用uni_links
库。首要,在pubspec.yaml
文件中增加uni_links
库的依靠项:
dependencies:
uni_links: ^0.5.1
然后,您需求在运用的进口点(一般是main
函数)监听深度链接事情。以下是一个监听深度链接事情的示例:
import 'package:uni_links/uni_links.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// 监听深度链接事情
StreamSubscription _sub = getUriLinksStream().listen((Uri uri) {
// 处理深度链接
print('Received deep link: $uri');
}, onError: (Object err) {
print('Failed to handle deep link: $err');
});
runApp(MyApp());
}
在此示例中,咱们运用getUriLinksStream
函数获取深度链接事情流,并监听该流以处理深度链接。
6.1.3 在 go_router 中处理深度链接
要在运用 go_router
的 Flutter 运用中处理深度链接,您需求将深度链接的 URL 映射到运用内的页面。以下是一个在 go_router
中处理深度链接的示例:
final goRouter = GoRouter(
routes: [
GoRoute(
path: '/',
pageBuilder: (context, state) => MaterialPage(child: HomePage()),
),
GoRoute(
path: '/details/:id',
pageBuilder: (context, state) {
final id = state.params['id'];
return MaterialPage(child: DetailsPage(id: id));
},
),
],
redirect: (state) {
// 从深度链接中获取参数
final uri = Uri.parse(state.location);
// 依据深度链接的URL映射到运用内的页面
if (uri.path == '/details') {
final id = uri.queryParameters['id'];
return '/details/$id';
}
},
);
在此示例中,咱们为GoRouter
界说了一个redirect
函数,该函数依据深度链接的URL将用户重定向到运用内的页面。
6.1.4 小结
本节介绍了深度链接的概念,以及怎么在运用go_router
模块的 Flutter 运用中处理深度链接。深度链接是一种答运用户直接翻开运用内特定页面的技能,有助于进步用户体会,增加用户参加度,并进步运用的转化率。在接下来的章节中,咱们将持续解说怎么在go_router
中处理重定向,以便更好地办理运用的页面跳转逻辑。
6.2 运用 go_router 处理深度链接
在上一节中,咱们介绍了深度链接的概念以及怎么在 Flutter 运用中处理深度链接。本节将要点介绍怎么在运用 go_router
模块的运用中处理深度链接。
6.2.1 装置并装备 uni_links 库
首要,咱们需求装置uni_links
库来处理深度链接。在pubspec.yaml
文件中增加uni_links
库的依靠项:
dependencies:
uni_links: ^0.5.1
接下来,咱们需求在运用的进口点(一般是main
函数)监听深度链接事情。以下是一个监听深度链接事情的示例:
import 'package:uni_links/uni_links.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// 监听深度链接事情
StreamSubscription _sub = getUriLinksStream().listen((Uri uri) {
// 处理深度链接
print('Received deep link: $uri');
}, onError: (Object err) {
print('Failed to handle deep link: $err');
});
runApp(MyApp());
}
6.2.2 界说 go_router 的路由
为了处理深度链接,咱们需求在go_router
中界说与深度链接相关的路由。以下是一个界说了两个路由的示例:
final goRouter = GoRouter(
routes: [
GoRoute(
path: '/',
pageBuilder: (context, state) => MaterialPage(child: HomePage()),
),
GoRoute(
path: '/details/:id',
pageBuilder: (context, state) {
final id = state.params['id'];
return MaterialPage(child: DetailsPage(id: id));
},
),
],
);
在此示例中,咱们界说了两个路由:主页(/
)和详情页(/details/:id
)。详情页的路由包括一个名为id
的参数,该参数将从深度链接的URL中提取。
6.2.3 在go_router
中处理深度链接
要在go_router
中处理深度链接,咱们需求界说一个redirect
函数。以下是一个在go_router
中处理深度链接的示例:
final goRouter = GoRouter(
routes: [
// ...路由界说...
],
redirect: (state) {
// 从深度链接中获取参数
final uri = Uri.parse(state.location);
// 依据深度链接的URL映射到运用内的页面
if (uri.path == '/details') {
final id = uri.queryParameters['id'];
return '/details/$id';
}
},
);
在此示例中,咱们为GoRouter
界说了一个redirect
函数,该函数依据深度链接的URL将用户重定向到运用内的页面。
6.2.4 在运用中运用go_router
导航
现在咱们已经为go_router
装备了深度链接处理,咱们能够在运用中运用go_router
的导航功用。以下是一个运用go_router
导航到详情页的示例:
void _onDetailsButtonPressed(BuildContext context) {
final goRouter = GoRouter.of(context);
goRouter.go('/details/42');
}
在此示例中,咱们运用GoRouter.of
函数获取运用的GoRouter
实例,然后调用go
办法导航到详情页。
6.2.5 小结
本节介绍了怎么在运用 go_router
模块的 Flutter 运用中处理深度链接。咱们首要装置并装备了uni_links
库,然后界说了与深度链接相关的路由。接下来,咱们在 go_router
中界说了一个redirect
函数来处理深度链接,最终在运用中运用 go_router
进行导航。
经过运用 go_router
处理深度链接,您能够为用户供给更好的体会,然后进步用户参加度和运用转化率。
6.3 完成重定向
在本节中,咱们将介绍怎么在运用go_router
模块的 Flutter 运用中完成重定向。重定向是一种在用户测验拜访某个页面时将其引导到另一个页面的办法。这在许多场景中十分有用,例如权限操控、条件烘托等。
6.3.1 界说重定向函数
要完成重定向,咱们需求在GoRouter
中界说一个redirect
函数。以下是一个简略的重定向函数示例,该函数将用户从/old
途径重定向到/new
途径:
final goRouter = GoRouter(
routes: [
// ...路由界说...
],
redirect: (state) {
if (state.location == '/old') {
return '/new';
}
},
);
在此示例中,咱们为GoRouter
界说了一个redirect
函数,该函数依据state.location
的值将用户重定向到不同的页面。
6.3.2 完成依据权限的重定向
在实践运用中,咱们可能需求依据用户的权限来决议是否答应拜访某个页面。以下是一个依据权限的重定向示例:
final goRouter = GoRouter(
routes: [
// ...路由界说...
],
redirect: (state) {
// 查看用户是否具有拜访权限
bool hasPermission = checkUserPermission();
if (state.location == '/protected' && !hasPermission) {
return '/login';
}
},
);
在此示例中,咱们首要查看用户是否具有拜访权限。假如用户测验拜访受保护的页面(/protected
),但没有权限,咱们将用户重定向到登录页面(/login
)。其间 checkUserPermission
函数用于查看用户是否具有拜访权限,比方假如未登录,则没有拜访权限,以下是参阅的完成代码:
bool checkUserPermission() {
// 获取登录状况
final SharedPreferences prefs = await SharedPreferences.getInstance();
final isLoggedIn = prefs.getBool('is_logged_in') ?? false;
// 假如未登录,则没有拜访权限
if (!isLoggedIn) {
return false;
}
// 获取用户人物
final userRole = prefs.getString('user_role') ?? '';
// 针对具体情况判别用户是否有权拜访受保护页面
// 示例:只答应具有 'admin' 人物的用户拜访
if (userRole == 'admin') {
return true;
} else {
return false;
}
}
其间,这儿能够从运用程序的状况办理器、耐久化存储等当地获取用户登录状况及其人物。代码中,咱们运用了 SharedPreferences 作为耐久化存储,你能够装置模块 shared_preferences
:
flutter pub add shared_preferences
然后在代码中引入:
import 'package:shared_preferences/shared_preferences.dart';
要存储数据到 SharedPreferences,您需求先运用 getInstance() 获取一个 SharedPreferences 实例,然后运用相应的办法存储数据,例如 setBool()、setInt()、setString() 等:
Future<void> saveLoginStatus(bool isLoggedIn) async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setBool('is_logged_in', isLoggedIn);
}
要从 SharedPreferences 读取数据,仍然需求先获取一个实例,然后运用相应的获取数据的办法,例如 getBool()、getInt()、getString() 等:
Future<bool> getLoginStatus() async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
final isLoggedIn = prefs.getBool('is_logged_in') ?? false;
return isLoggedIn;
}
默许需求用户是办理员人物,实践中,更多情况是存储在后台的,需求恳求后端数据来承认用户权限。在这种情况下,需求在 Flutter 运用中像后端 API 发送恳求,然后依据获取的数据判别用户是否具有相应的权限。以下是一个运用 http 库(向后端建议恳求)的示例,来获取用户权限并履行 checkUserPermission 函数。你能够装置 dio
模块用于 Http 恳求:
flutter pub add dio
然后,在需求发送恳求的当地导入 dio 库:
import 'package:dio/dio.dart';
然后从后端获取数据,以完成 checkUserPermission
:
Future<bool> checkUserPermission() async {
// 创立 Dio 实例
Dio dio = Dio();
try {
// 向服务器建议恳求获取用户权限数据,以下URL地址仅作示例,请依据您的实践API地址进行修改
final response = await dio.get("https://your-server.com/api/user_permission");
// 提取用户人物
String userRole = response.data["role"];
// 依据恳求数据判别用户是否具有办理员权限
if (userRole == "admin") {
return true;
} else {
return false;
}
} catch (e) {
// 假如恳求失败,回来false表明没有拜访权限
return false;
}
}
6.3.3 完成依据条件的重定向
除了依据权限的重定向外,咱们还能够依据其他条件来完成重定向。以下是一个依据条件的重定向示例:
final goRouter = GoRouter(
routes: [
// ...路由界说...
],
redirect: (state) {
// 获取设备类型
final deviceType = getDeviceType();
if (state.location == '/tablet' && deviceType != 'tablet') {
return '/mobile';
}
},
);
在此示例中,咱们首要获取设备类型。假如用户测验拜访适用于平板电脑的页面(/tablet
),但设备类型不是平板电脑,咱们将用户重定向到适用于手机的页面(/mobile
)。
6.3.4 小结
本节介绍了怎么在运用go_router
模块的 Flutter 运用中完成重定向。咱们首要界说了一个重定向函数,然后介绍了怎么完成依据权限和条件的重定向。
经过运用go_router
完成重定向,您能够更好地办理运用的页面跳转逻辑,然后进步用户体会和运用安全性。在接下来的章节中,咱们将持续介绍 go_router
模块的其他功用,如动画导航等。
7. 路由护卫与路由过渡动画
7.1 路由护卫的作用与完成
在本节中,咱们将介绍路由护卫的概念以及怎么在运用go_router
模块的 Flutter 运用中完成路由护卫。路由护卫是一种在用户测验拜访某个页面之前履行的拦截器,能够用于权限操控、数据预加载等场景。
7.1.1 路由护卫的作用
路由护卫的首要作用如下:
- 权限操控:在用户拜访受保护的页面之前,查看用户是否具有拜访权限。假如没有权限,能够重定向到登录页面或显现提示信息。
- 数据预加载:在用户拜访某个页面之前,预先加载所需的数据。这能够进步页面加载速度,提升用户体会。
- 页面跳转操控:在用户拜访某个页面之前,依据特定条件决议是否答应页面跳转。
7.1.2 完成路由护卫
要在go_router
模块中完成路由护卫,咱们需求为每个需求护卫的路由界说一个guard
函数。以下是一个简略的路由护卫示例:
// 路由护卫函数
Future<bool> authGuard(BuildContext context, GoRouterState state) async {
// 查看用户是否具有拜访权限
bool hasPermission = await checkUserPermission();
if (!hasPermission) {
// 假如没有权限,重定向到登录页面
GoRouter.of(context).go('/login');
return false;
}
return true;
}
final goRouter = GoRouter(
routes: [
GoRoute(
path: '/protected',
pageBuilder: (context, state) {
return MaterialPage(child: ProtectedPage());
},
guards: [authGuard],
),
// ...其他路由界说...
],
);
在此示例中,咱们首要界说了一个名为authGuard
的路由护卫函数。该函数查看用户是否具有拜访权限,假如没有权限,则重定向到登录页面,并回来false
以阻挠页面跳转。
然后,咱们在GoRoute
中为受保护的页面(/protected
)增加了guards
特点,并将authGuard
函数作为护卫。
7.1.3 小结
本节介绍了路由护卫的作用以及怎么在运用go_router
模块的 Flutter 运用中完成路由护卫。路由护卫是一种在用户测验拜访某个页面之前履行的拦截器,能够用于权限操控、数据预加载等场景。经过运用go_router
完成路由护卫,您能够更好地办理运用的页面跳转逻辑,然后进步用户体会和运用安全性。
7.2 运用 go_router 完成路由护卫
在本节中,咱们将深化讨论怎么运用go_router
模块完成路由护卫。咱们将从一个简略的权限操控场景开端,然后讨论怎么完成更杂乱的路由护卫功用。
7.2.1 示例:权限操控
假定咱们的运用有两个页面:一个登录页面和一个受保护的页面。用户只有在登录后才能拜访受保护的页面。咱们能够运用go_router
的路由护卫功用来完成这个需求。
首要,咱们需求为受保护的页面界说一个路由护卫函数,如下所示:
Future<bool> authGuard(BuildContext context, GoRouterState state) async {
// 查看用户是否已登录
bool isLoggedIn = await checkUserLoggedIn();
if (!isLoggedIn) {
// 假如用户未登录,重定向到登录页面
GoRouter.of(context).go('/login');
return false;
}
return true;
}
然后,在GoRoute
中为受保护的页面增加guards
特点,并将authGuard
函数作为护卫:
final goRouter = GoRouter(
routes: [
GoRoute(
path: '/protected',
pageBuilder: (context, state) {
return MaterialPage(child: ProtectedPage());
},
guards: [authGuard],
),
// ...其他路由界说...
],
);
现在,只有在用户登录后才能拜访受保护的页面。假如用户未登录,他们将被重定向到登录页面。
7.2.2 示例:数据预加载
在某些情况下,咱们可能希望在用户拜访页面之前预先加载一些数据。咱们能够运用路由护卫来完成这个功用。
首要,咱们需求界说一个路由护卫函数,用于加载数据:
Future<bool> loadDataGuard(BuildContext context, GoRouterState state) async {
// 加载所需的数据
await loadData();
return true;
}
然后,在GoRoute
中为需求预加载数据的页面增加guards
特点,并将loadDataGuard
函数作为护卫:
final goRouter = GoRouter(
routes: [
GoRoute(
path: '/data',
pageBuilder: (context, state) {
return MaterialPage(child: DataPage());
},
guards: [loadDataGuard],
),
// ...其他路由界说...
],
);
现在,在用户拜访数据页面之前,loadDataGuard
函数将被调用以加载数据。
7.2.3 小结
本节深化讨论了怎么运用go_router
模块完成路由护卫。咱们经过两个示例展现了怎么完成权限操控和数据预加载功用。经过运用go_router
完成路由护卫,您能够更好地办理运用的页面跳转逻辑,然后进步用户体会和运用安全性。
8. go_router 过渡动画
在章中,咱们将讨论怎么运用 go_router
模块为 Flutter 运用程序的页面切换增加自界说过渡动画。默许情况下,Flutter 供给了一些根本的页面过渡作用,但有时咱们可能需求自界说这些作用以进步用户体会。经过运用go_router
模块,咱们能够轻松地完成自界说过渡动画。
8.1 示例:淡入淡出动画
咱们将首要创立一个简略的淡入淡出过渡动画。为此,咱们需求在GoRoute
的pageBuilder
特点中运用CustomTransitionPage
组件。以下示例演示了怎么为页面切换增加淡入淡出动画:
final goRouter = GoRouter(
routes: [
GoRoute(
path: '/fade',
pageBuilder: (context, state) {
return CustomTransitionPage(
transitionsBuilder: (context, animation, secondaryAnimation, child) {
return FadeTransition(
opacity: animation,
child: child,
);
},
child: FadePage(),
);
},
),
// ...其他路由界说...
],
);
在这个比如中,咱们运用了CustomTransitionPage
组件,并将transitionsBuilder
特点设置为一个回来FadeTransition
的函数。这将使页面切换时发生淡入淡出作用。
8.2 示例:缩放动画
接下来,咱们将创立一个缩放过渡动画。与上一个示例类似,咱们将运用CustomTransitionPage
组件,并将transitionsBuilder
特点设置为一个回来ScaleTransition
的函数。以下示例演示了怎么为页面切换增加缩放动画:
final goRouter = GoRouter(
routes: [
GoRoute(
path: '/scale',
pageBuilder: (context, state) {
return CustomTransitionPage(
transitionsBuilder: (context, animation, secondaryAnimation, child) {
return ScaleTransition(
scale: animation,
child: child,
);
},
child: ScalePage(),
);
},
),
// ...其他路由界说...
],
);
在这个比如中,咱们运用了CustomTransitionPage
组件,并将transitionsBuilder
特点设置为一个回来ScaleTransition
的函数。这将使页面切换时发生缩放作用。
8.3 示例:组合动画
咱们还能够组合多个过渡动画以创立更杂乱的作用。以下示例演示了怎么将淡入淡出动画和缩放动画组合在一起:
final goRouter = GoRouter(
routes: [
GoRoute(
path: '/combined',
pageBuilder: (context, state) {
return CustomTransitionPage(
transitionsBuilder: (context, animation, secondaryAnimation, child) {
return FadeTransition(
opacity: animation,
child: ScaleTransition(
scale: animation,
child: child,
),
);
},
child: CombinedPage(),
);
},
),
// ...其他路由界说...
],
);
在这个比如中,咱们将FadeTransition
和ScaleTransition
组件嵌套在一起,以一起运用淡入淡出和缩放作用。
8.4 小结
本章介绍了怎么运用go_router
模块为 Flutter 运用程序的页面切换增加自界说过渡动画。咱们经过三个示例展现了怎么完成淡入淡出动画、缩放动画以及组合动画。经过运用go_router
模块完成自界说路由过渡动画,能够改善用户体会并为运用增加更好的视觉作用。
F. 附录
F.1 Flutter Route 类 API
F.1.1 Route<T> 类结构器
Route({RouteSettings? settings})
用于初始化 Route。其间 RouteSettings 类为可能对构建 Route 有用的数据。
RouteSettings 具有以下特点:
特点 | 类型 | 标签 | 描绘 |
---|---|---|---|
arguments |
Object? | final | 传递到此 Route 的参数。 |
hashCode |
int | read-only、inherited | 此方针的哈希代码。 |
name |
String? | final | Route的称号(例如,“/settings”)。 |
runtimeType |
Type | read-only、inherited | 方针运行时类型的表明方式。 |
F.1.2 Route<T> 类特点
特点 | 类型 | 标签 | 描绘 |
---|---|---|---|
currentResult |
T? | read-only | 当弹出此途径时(参见Navigator.pop ),假如未指定成果或成果为空,将运用此值。 |
hasActiveRouteBelow |
bool | read-only | 此路由下是否至少有一个活动路由。 |
hashCode |
int | read-only、inherited | 此方针的哈希码。 |
isActive |
bool | read-only | 这条道路是否在导航器上。 |
isCurrent |
bool | read-only | 此路由是否是导航器上的最顶层(当时)路由。 |
isFirst |
bool | read-only | 此路由是否是导航器上最底部的活动路由。 |
navigator |
NavigatorState? | read-only | 路由地点的导航器(假如有)。 |
overlayEntries |
List<OverlayEntry> | read-only | 此路由的覆盖条目。 |
popped |
Future<T?> | read-only | 当这条路由从导航器中弹出时,Future就完成了 |
restorationScopeId |
ValueListenable<String?> | read-only | 用于此路由周围的 RestorationScope 的还原范围ID。 |
runtimeType |
Type | read-only、inherited | 方针运行时类型的表明方式。 |
settings |
RouteSettings | read-only | 此路由的设置。 |
willHandlePopInternally |
bool | read-only | 调用 didPop 是否会回来false。 |
F.1.3 Route<T> 类办法
changedExternalState() → void
每逢 导航器(Navigator)以某种可能影响道路的办法更新时调用,以指示道路可能也希望重建。
changedInternalState() → void
每逢路由的内部状况改变时调用。
didAdd() → void
将道路增加到导航器后,在 装置 后调用。
didChangeNext(Route? nextRoute) → void
此路由的下一条道路已更改为给定的新路由。
didChangePrevious(Route? previousRoute) → void
此路由的从前路由已更改为给定的新路由。
didComplete(T? result) → void
该路由被弹出或许正被优雅地移除。
didPop(T? result) → bool
弹出此路由的恳求。
- 假如路由能够在内部处理它(例如,由于它有自己的内部状况仓库),则回来false;
- 否则回来true(经过回来调用super.didPop的值)。回来false将阻挠NavigatorState.pop的默许行为。
didPopNext(Route nextRoute) → void
坐落这条路由上方的给定路由已从导航器中弹(pop)出。
didPush() → TickerFuture
当路由被 push 到导航器上时,在装置后调用。
didReplace(Route? oldRoute) → void
当导航器中的道路替换了另一个路由时,在装置后调用。
dispose() → void
丢掉方针运用的任何资源。
install() → void
当路由刺进导航器时调用。
willPop() → Future
回来当此 Route 是当时路由 (is current) 时调用 Navigator.maybePop
是否应该履行任何操作。
F.2 Flutter Navigator 类 API
导航器会将其 Navigator.pages
转换为一个路由仓库(假如供给的话)。Navigator.pages
中的更改将触发路由仓库的更新。导航器将更新其路由以匹配其Navigator.pages的新装备。要运用此 API,能够创立一个 Page 子类并为 Navigator.pages 界说一个页面列表。还需求 Navigator.onPopPage
回调以在弹出时正确清理输入页面。
默许情况下,导航器将运用 DefaultTransitionDelegate 来决议道路怎么进出屏幕。要自界说它,请界说一个 TransitionDelegate 子类,并将其供给给 Navigator.transitionDelegate
。
有关运用pages API的更多信息,请参见 Router 部件。
F.2.1 Navigator 类特点
特点 | 类型 | 标签 | 描绘 |
---|---|---|---|
clipBehavior |
Clip | final | 依据此选项,内容将被剪切(或不被剪切)。 |
hashCode |
int | read-only, inherited | 此方针的哈希码。 |
initialRoute |
String? | final | 显现的第一个路由的称号。 |
key |
Key? | final, inherited | 操控树中一个 Widget 怎么替换另一个 Widget。 |
observers |
List | final | 此 Navigator 的观察者列表。 |
onGenerateInitialRoutes |
RouteListFactory | final | 当 Widget 创立时,假如 initialRoute 不为 null,则调用此函数以生成初始的 Route 方针列表。 |
onGenerateRoute |
RouteFactory? | final | 为给定的 RouteSettings 生成路由时调用。 |
onPopPage |
PopPageCallback? | final | 当调用 pop 时,但当时路由对应于 pages 列表中的 Page 时调用。 |
onUnknownRoute |
RouteFactory? | final | 当 onGenerateRoute 无法生成路由时调用。 |
pages |
List<Page> | final | 用于填充历史记录的页面列表。 |
reportsRouteUpdateToEngine |
bool | final | 当最顶层路由发生变化时,此 Navigator 是否应向引擎陈述路由更新音讯。 |
requestFocus |
bool | final | 当将新路由推送到 Navigator 时,Navigator 及其最顶层路由是否应恳求焦点。 |
restorationScopeId |
String? | final | 康复 Navigator 的状况的 ID,包括其历史记录。 |
routeTraversalEdgeBehavior |
TraversalEdgeBehavior | final | 操控在路由内部的 Widget 之间界说焦点遍历的焦点范围的第一个和最终一个项目之外的焦点传递。 |
runtimeType |
Type | read-only, inherited | 方针的运行时类型表明。 |
transitionDelegate |
TransitionDelegate | final | 用于决议在页面更新期间路由怎么进入或离开屏幕的委托。 |
F.2.2 Navigator 类办法
办法 | 回来类型 | 标签 | 描绘 |
---|---|---|---|
createElement() |
StatefulElement | inherited | 创立一个 StatefulElement 来办理这个小部件在树中的方位。 |
createState() |
NavigatorState | override | 在树中的给定方位创立该小部件的可变状况。 |
debugDescribeChildren() |
List<DiagnosticsNode> | inherited | 回来描绘此节点子节点的 DiagnosticsNode 方针列表。 |
debugFillProperties() |
void | inherited | 增加与节点相关的其他特点。 |
noSuchMethod() |
dynamic | inherited | 当拜访不存在的办法或特点时调用。 |
toDiagnosticsNode() |
DiagnosticsNode | inherited | 回来用于调试东西和 DiagnosticsNode.toStringDeep 的方针的调试表明。 |
toString() |
String | inherited | 该方针的字符串表明。 |
toStringDeep() |
String | inherited | 回来此节点及其子节点的字符串表明方式。 |
toStringShallow() |
String | inherited | 回来该方针的一行具体描绘。 |
toStringShort() |
String | inherited | 该小部件的简略文本描绘。 |
F.2.2 Navigator 类静态办法
办法 | 回来类型 | 描绘 |
---|---|---|
canPop (BuildContext context) |
bool | 查看最严密围住给定上下文的导航器是否能够弹出。 |
defaultGenerateInitialRoutes (NavigatorState navigator, String initialRouteName) |
List<Route> | 将路由称号转换为一组 Route 方针。 |
maybeOf (BuildContext context, {bool rootNavigator = false}) |
NavigatorState? | 回来围住给定上下文的最近一次实例的状况,假如有的话。 |
maybePop <T extends Object?>(BuildContext context, [T? result]) |
Future<bool> | 调用当时路由的 Route.willPop 办法,并依据成果采取相应的操作,可能作为成果弹出路由;回来是否应该将弹出恳求视为已处理。 |
of (BuildContext context, {bool rootNavigator = false}) |
NavigatorState | 回来围住给定上下文的最近一次实例的状况。 |
pop <T extends Object?>(BuildContext context, [T? result]) |
void | 从最严密围住给定上下文的导航器中弹出最顶层的路由。 |
popAndPushNamed <T extends Object?, TO extends Object?>(BuildContext context, String routeName, {TO? result, Object? arguments}) |
Future<T?> | 弹出最严密围住给定上下文的当时路由,并在其方位推入一个签字路由。 |
popUntil (BuildContext context, RoutePredicate predicate) |
void | 在最严密围住给定上下文的导航器上重复调用 pop,直到断语函数回来 true。 |
push <T extends Object?>(BuildContext context, Route<T> route) |
Future<T?> | 将给定的路由推入最严密围住给定上下文的导航器中。 |
pushAndRemoveUntil <T extends Object?>(BuildContext context, Route<T> newRoute, RoutePredicate predicate) |
Future<T?> | 将给定的路由推入最严密围住给定上下文的导航器中,然后移除一切之前的路由,直到断语函数回来 true。 |
pushNamed <T extends Object?>(BuildContext context, String routeName, {Object? arguments}) |
Future<T?> | 将一个签字路由推入最严密围住给定上下文的导航器中。 |
pushNamedAndRemoveUntil <T extends Object?>(BuildContext context, String newRouteName, RoutePredicate predicate, {Object? arguments}) |
Future<T?> | 将具有给定称号的路由推入最严密围住给定上下文的导航器中,并移除之前的一切路由,直到断语函数回来 true。 |
pushReplacement <T extends Object?, TO extends Object?>(BuildContext context, Route<T> newRoute, {TO? result}) |
Future<T?> | 经过推入给定的路由并在新路由动画完成后毁掉前一个路由,替换最严密围住给定上下文的导航器的当时路由。 |
pushReplacementNamed <T extends Object?, TO extends Object?>(BuildContext context, String routeName, {TO? result, Object? arguments}) |
Future<T?> | 经过推入签字路由并在新路由动画完成后毁掉前一个路由,替换最严密围住给定上下文的导航器的当时路由。 |
removeRoute (BuildContext context, Route route) |
void | 立即从最严密围住给定上下文的导航器中移除路由,并调用 Route.dispose 办法进行处理。 |
removeRouteBelow (BuildContext context, Route anchorRoute) |
void | 立即从最严密围住给定上下文的导航器中移除坐落给定 anchorRoute 下方的路由,并调用 Route.dispose 办法进行处理。 |
replace <T extends Object?>(BuildContext context, {required Route oldRoute, required Route<T> newRoute}) |
void | 运用新路由替换最严密围住给定上下文的导航器上的现有路由。 |
replaceRouteBelow <T extends Object?>(BuildContext context, {required Route anchorRoute, required Route<T> newRoute}) |
void | 运用新路由替换最严密围住给定上下文的导航器上给定 anchorRoute 下方的现有路由。 |
restorablePopAndPushNamed <T extends Object?, TO extends Object?> |
String | 将最严密围住给定上下文的导航器中的当时路由弹出并推入一个签字路由。 |
restorablePush <T extends Object?> |
String | 在最严密围住给定上下文的导航器中推入一个新路由。 |
restorablePushAndRemoveUntil <T extends Object?> |
String | 在最严密围住给定上下文的导航器中推入一个新路由,并删去之前的一切路由,直到断语函数回来 true。 |
restorablePushNamed <T extends Object?> |
String | 在最严密围住给定上下文的导航器中推入一个签字路由。 |
restorablePushNamedAndRemoveUntil <T extends Object?> |
String | 将具有给定称号的路由推入最严密围住给定上下文的导航器中,并删去之前的一切路由,直到断语函数回来 true。 |
restorablePushReplacement <T extends Object?, TO extends Object?> |
String | 经过推入一个新路由并在新路由动画完成后毁掉前一个路由,替换最严密围住给定上下文的导航器的当时路由。 |
restorablePushReplacementNamed <T extends Object?, TO extends Object?> |
String | 经过推入签字路由并在新路由动画完成后毁掉前一个路由,替换最严密围住给定上下文的导航器的当时路由。 |
restorableReplace <T extends Object?> |
String | 运用新路由替换最严密围住给定上下文的导航器上的现有路由。 |
restorableReplaceRouteBelow <T extends Object?> |
String | 运用新路由替换最严密围住给定上下文的导航器上给定 anchorRoute 下方的现有路由。 |
F.3 go_router 模块的 GoRouter 类
【注意】:GoRouter 和 GoRoute 是两个类。
- GoRouter 类是 go_router 的中心类,担任办理整个运用程序的路由体系。它保护了一个路由装备(RouteConfiguration),办理路由信息的解析(GoRouteInformationParser)和供给(GoRouteInformationProvider),以及操控页面导航和路由状况的变化。GoRouter 类供给了一系列办法来处理路由的导航、增加监听器、刷新路由等操作,如 push、pop、replace、addListener、refresh 等。
- GoRoute 类是表明单个路由的方针。它界说了一个具体的路由途径、参数和相关的操作。每逢用户导航到一个新的路由时,GoRouter 会创立一个对应的 GoRoute 方针,并将其增加到路由仓库中。GoRoute 类供给了一些办法来处理路由的生成、匹配、跳转和导航等操作,如 go、goNamed、namedLocation、replaceNamed 等。
总结来说,GoRouter 类是整个路由体系的办理者,担任路由的全体操控和状况办理,而 GoRoute 类是单个路由的表明和操作者,担任具体路由的生成、匹配和导航等操作。
例如:
import 'package:go_router/go_router.dart'; // 界说路由装备 final routeConfig = RouteConfiguration( routes: { '/': (context) => HomePage(), // 根路由 '/settings': (context) => SettingsPage(), // 设置页面路由 '/profile/:username': (context, state) => ProfilePage(username: state.params['username']), // 用户个人资料页面路由 }, ); // 创立 GoRouter 实例 final goRouter = GoRouter( routes: routeConfig.routes, errorPageBuilder: (context, state) => ErrorPage(), // 过错页面 ); // 在 MaterialApp 或 CupertinoApp 中运用 goRouter.routerDelegate 作为路由委托 MaterialApp( ... routerDelegate: goRouter.routerDelegate, backButtonDispatcher: goRouter.backButtonDispatcher, ... ); // 在任何需求进行路由导航的当地,能够经过 goRouter 实例进行操作 void navigateToSettings() { goRouter.pushNamed('/settings'); } void navigateToProfile(String username) { goRouter.goNamed('/profile/:username', pathParameters: {'username': username}); }
go_router 模块中供给了一个 GoRouter 方针,用于界说和办理运用程序的路由。
GoRouter 是 go_router 库的中心类,它担任路由的注册、导航和页面烘托。经过创立一个 GoRouter 方针,你能够装备运用程序的路由规矩并办理不同页面之间的导航。
在创立 GoRouter 方针时,你能够指定一组路由规矩。每个路由规矩由一个途径形式和一个处理程序(Handler)组成。途径形式是一个字符串,用于匹配特定的 URL 途径。处理程序则界说了当途径与形式匹配时要履行的操作,一般是展现相应的页面。
GoRouter 方针供给了多个办法来办理路由和导航,包括:
-
push
:将指定的途径推入导航仓库,导航到相应的页面。 -
pop
:将当时页面从导航仓库中弹出,回来上一个页面。 -
replace
:替换当时页面为指定的途径对应的页面。 -
navigateTo
:依据给定的途径导航到相应的页面。
除了根本的导航功用外,GoRouter 还支撑以下特性:
- 参数传递:你能够在导航时传递参数,以便在方针页面上运用。
- 嵌套路由:你能够在页面中嵌套多个 GoRouter 方针,完成更杂乱的路由结构。
- 路由护卫:你能够界说路由护卫,用于在导航到页面之前履行一些操作,如验证用户权限等。
以下是 GoRouter 方针的特点和办法的解析:
在 pub.dev 文档中,GoRoute 类的文档地址为: pub.dev/documentati…
GoRouter 方针的特点
特点 | 类型 | 标签 | 描绘 |
---|---|---|---|
backButtonDispatcher | BackButtonDispatcher | final | 用于装备 Router 的 BackButtonDispatcher。 |
configuration | RouteConfiguration | late final | GoRouter 运用的路由装备。 |
hashCode | int | read-only inherited | 此方针的哈希码。 |
hasListeners | bool | read-only inherited | 当时是否有任何监听器已注册。 |
location | String | read-only | 获取当时方位。 |
routeInformationParser | GoRouteInformationParser | late final override-getter | GoRouter 运用的路由信息解析器。 |
routeInformationProvider | GoRouteInformationProvider | late final override-getter | GoRouter 运用的路由信息供给器。 |
routerDelegate | GoRouterDelegate | late final override-getter | 路由署理。在 MaterialApp 或 CupertinoApp 的 .router() 结构函数中供给此方针。 |
runtimeType | Type | read-only inherited | 方针的运行时类型表明。 |
GoRouter 方针的办法
办法 | 回来类型 | 标签 | 描绘 |
---|---|---|---|
addListener (VoidCallback listener) |
void | inherited | 注册一个闭包,在方针发生变化时调用。 |
canPop () |
bool | 假如能够弹出至少两个或更多路由,则回来 true。 | |
dispose () |
void | 开释方针运用的任何资源。调用此办法后,方针将处于不可用状况,应将其丢掉(在方针被处理后,调用 addListener 将引发异常)。 | |
go (String location, {Object? extra}) |
void | 导航到指定的 URI 方位,可选包括查询参数,例如 /family/f2/person/p1?color=blue。 | |
goNamed (String name, {Map<String, String> pathParameters = const <String, String>{}, Map<String, dynamic> queryParameters = const <String, dynamic>{}, Object? extra}) |
void | 导航到指定的命名路由,可选包括参数,例如 name=’person’,pathParameters={‘fid’: ‘f2’, ‘pid’: ‘p1’}。 | |
namedLocation (String name, {Map<String, String> pathParameters = const <String, String>{}, Map<String, dynamic> queryParameters = const <String, dynamic>{}}) |
String | 依据路由称号和参数获取方位。这关于重定向到命名方位十分有用。 | |
noSuchMethod (Invocation invocation) |
dynamic | inherited | 当拜访不存在的办法或特点时调用。 |
notifyListeners () |
void | inherited | 调用一切注册的监听器。 |
pop <T extends Object?>([T? result]) |
void | 弹出当时屏幕上最顶部的路由。 | |
push <T extends Object?>(String location, {Object? extra}) |
Future<T?> | 将 URI 方位推入页面仓库中,可选包括查询参数,例如 /family/f2/person/p1?color=blue。 | |
pushNamed <T extends Object?>(String name, {Map<String, String> pathParameters = const <String, String>{}, Map<String, dynamic> queryParameters = const <String, dynamic>{}, Object? extra}) |
Future<T?> | 将命名路由推入页面仓库中,可选包括参数,例如 name=’person’,pathParameters={‘fid’: ‘f2’, ‘pid’: ‘p1’}。 | |
pushReplacement <T extends Object?>(String location, {Object? extra}) |
Future<T?> | 运用给定的 URL 方位替换页面仓库中的最顶部页面,可选包括查询参数,例如 /family/f2/person/p1?color=blue。 | |
pushReplacementNamed <T extends Object?>(String name, {Map<String, String> pathParameters = const <String, String>{}, Map<String, dynamic> queryParameters = const <String, dynamic>{}, Object? extra}) |
Future<T?> | 运用命名路由替换页面仓库中的最顶部页面,可选包括参数,例如 name=’person’,pathParameters={‘fid’: ‘f2’, ‘pid’: ‘p1’}。 | |
refresh () |
void | 刷新路由。 | |
removeListener (VoidCallback listener) |
void | inherited | 从注册的闭包列表中移除从前注册的闭包,这些闭包在方针发生变化时被告诉。 |
replace (String location, {Object? extra}) |
Future<T?> | 将页面仓库中的最顶部页面替换为给定页面,但将其视为同一页面。 | |
replaceNamed (String name, {Map<String, String> pathParameters = const <String, String>{}, Map<String, dynamic> queryParameters = const <String, dynamic>{}, Object? extra}) |
Future<T?> | 运用命名路由替换最顶部的页面,并保留页面键和可选参数。 | |
restore (RouteMatchList matchList) |
void | 康复 RouteMatchList。 | |
toString () |
String | inherited | 回来方针的字符串表明方式。 |
GoRouter 方针的静态特点和静态办法
特点 | 类型 | 标签 | 描绘 |
---|---|---|---|
optionURLReflectsImperativeAPIs | bool | read / write | 指令式API是否影响浏览器地址栏。 |
办法 | 回来类型 | 描绘 |
---|---|---|
maybeOf (BuildContext context) |
GoRouter | 小部件树中的当时GoRouter(假如有)。 |
of (BuildContext context) |
GoRouter | 在小部件树中查找当时的GoRouter。 |