Flutter路由与组件切换插件routed_widget_switcher的使用
Flutter路由与组件切换插件routed_widget_switcher的使用
特性
RoutedSwitcher
允许你根据当前 Router
的位置声明式地切换子部件。
class SideBar extends StatelessWidget {
Widget build(_){
return RoutedSwitcher(
builders: (_) => [
Routed('/', MainMenu.new),
Routed('/dashboard', DashboardMenu.new),
]);
}
}
该插件旨在作为任何 Router
(如 Nav2)实现的补充包。包括流行的路由解决方案如 GoRouter
、RouteMaster
或 VRouter
。
此插件主要适用于以下两种情况:
- 当你有围绕导航器的框架,如
SideBar
或TitleBar
,并且希望它能对位置变化做出反应。 - 当多个路径解析为相同的
Page
并且你想将后续路由进一步深入到树结构中。
注意: 此包不提供对路由器位置的任何控制,它只是读取当前位置并相应地作出响应。
安装
在你的 pubspec.yaml
文件中添加依赖:
dependencies:
routed_widget_switcher: ^2.0.1
使用
将 RoutedSwitcher
放置在根 Router
小部件下方,并定义你想要匹配的路径。默认情况下,路径被认为是大小写不敏感的,并被视为前缀,但可以使用 .exact
扩展方法或 usePrefix: false
设置来禁用此行为。
所有部件都是懒加载的,可以使用闭包定义:() => MyPage
或构造函数撕裂:MyPage.new
。
return RoutedSwitcher(
caseSensitive: true,
builders: (info) => [
// 使用 '.exact' 来仅匹配 '/'
Routed('/', MainMenu.new).exact,
// 匹配任何以 `/dashboard` 开头的内容
Routed('/dashboard', DashboardMenu.new),
// 使用闭包,这样我们可以访问查询参数
Routed('/settings', () => SettingsMenu(type: info.queryParams['type'])),
],
);
如上所示,builders
委托传递一个 RoutedInfo
对象,其中包含有关当前匹配的信息。这包括:
- url
- matchingRoute
- pathParams
- queryParams
你还可以从任何后代小部件调用 RoutedInfo.of(context)
来按需访问信息。
未知路由
使用 unknownRouteBuilder
处理意外的路由。如果未提供委托,则将使用 DefaultUnknownRoute
小部件。
路径匹配
路径可以定义为简单的字符串,如 /user/new
或 user/:userId
,也可以使用正则表达式语法,如 r'/user/:id(\d+)'
。更多信息请参见 pathToRegExp
库:https://pub.dev/packages/path_to_regexp。
除了 pathToRegExp
进行的匹配之外,还可以使用通配符 *
来匹配任何位置。
最具体匹配
RoutedSwitcher
会尝试使用最具体的匹配。例如,URL /users/new
可以匹配以下三个构建器:
Routed('/users/:userId', TeamDetails.new),
Routed('/users/new', NewTeamForm.new),
Routed('*', TeamStandings.new),
由于 /users/new
是更精确的匹配,因此它将被渲染,无论它们的声明顺序如何。接下来是 /users/:userId
,最后是通配符 *
。
过渡效果
内部使用 Flutter 的 AnimatedSwitcher
小部件进行过渡,因此可以使用完整的 API 来实现不同的过渡效果。
return RoutedSwitcher(
transitionBuilder: ...,
duration: ...,
builders: ...,
)
相对链接和继承
支持任意深度的嵌套 RoutedSwitcher
,并通过省略 /
字符来定义相对路径。
return RoutedSwitcher(
builders: (_) => [
Routed(
'/messages',
() => RoutedSwitcher(
builders: (_) => [
Routed('', Inbox.new), // -> /messages/
Routed('inbox', Inbox.new), // -> /messages/inbox
Routed('outbox', Outbox.new), // -> /messages/outbox
],
),
),
],
);
Bug/请求
如果你遇到任何问题,请打开一个 issue。如果你觉得库缺少功能,请在 GitHub 上提出一个票,我们将进行评估。欢迎提交 pull request。
许可证
MIT 许可证
示例代码
// ignore_for_file: use_key_in_widget_constructors
import 'package:example/router_examples/go_router_app.dart';
import 'package:example/router_examples/routermaster_app.dart';
import 'package:example/router_examples/url_router.dart';
import 'package:example/router_examples/vrouter_app.dart';
import 'package:flutter/material.dart';
import 'package:routed_widget_switcher/routed_widget_switcher.dart';
import 'widgets.dart';
/// 此演示展示了 `routed_widget_switcher` 在各种流行路由库中的工作方式。因为切换器直接绑定到 Router,所以它适用于任何路由器实现。
///
/// 为了测试,请使用键盘切换不同的路径。观察侧边栏根据当前位置更改其子部件。
void main() {
runApp(MultiAppTestRig(
testNames: ['GoRouter', 'VRouter', 'RouteMaster', 'UrlRouter'],
tests: [
(_) => GoRouterApp(),
(_) => VRouterApp(),
(_) => RouteMasterApp(),
// (_) => BeamerApp(),
(_) => UrlRouterApp(),
],
));
//runApp(NestedAppExample());
}
/// 嵌入在任何示例应用框架内的此小部件使用 `RoutedWidgetSwitcher` 在路由器位置发生变化时切换子部件。
class SideBar extends StatelessWidget {
const SideBar({Key? key}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
Widget buildSideBarBg(Widget child) => Material(child: SizedBox(width: 180, child: child));
return buildSideBarBg(
RoutedSwitcher(
builders: (_) => [
// 通配符将匹配任何路由
Routed('*', MainMenu.new),
Routed('/dashboard', DashboardMenu.new),
Routed('/settings', SettingsMenu.new),
],
),
);
}
}
更多关于Flutter路由与组件切换插件routed_widget_switcher的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html