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)实现的补充包。包括流行的路由解决方案如 GoRouterRouteMasterVRouter

此插件主要适用于以下两种情况:

  • 当你有围绕导航器的框架,如 SideBarTitleBar,并且希望它能对位置变化做出反应。
  • 当多个路径解析为相同的 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/newuser/: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

1 回复

更多关于Flutter路由与组件切换插件routed_widget_switcher的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter中使用routed_widget_switcher插件来实现路由与组件切换的示例代码。routed_widget_switcher是一个用于在Flutter应用中实现动态路由和组件切换的插件。以下是一个基本的示例,展示了如何使用这个插件。

首先,确保你已经在pubspec.yaml文件中添加了routed_widget_switcher依赖:

dependencies:
  flutter:
    sdk: flutter
  routed_widget_switcher: ^最新版本号 # 请替换为最新版本号

然后运行flutter pub get来安装依赖。

接下来,我们可以开始编写代码。在这个示例中,我们将创建一个简单的Flutter应用,其中包含两个页面(组件),并使用routed_widget_switcher在它们之间切换。

import 'package:flutter/material.dart';
import 'package:routed_widget_switcher/routed_widget_switcher.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: RoutedWidgetSwitcher(
        routes: {
          '/': (context) => HomePage(),
          '/second': (context) => SecondPage(),
        },
        initialRoute: '/',
      ),
    );
  }
}

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home Page'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            Navigator.of(context).pushNamed('/second');
          },
          child: Text('Go to Second Page'),
        ),
      ),
    );
  }
}

class SecondPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Second Page'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            Navigator.of(context).pop(); // 返回上一页
          },
          child: Text('Go Back'),
        ),
      ),
    );
  }
}

在这个示例中:

  1. MyApp类是我们的主应用类,它使用MaterialApp作为顶层组件。
  2. RoutedWidgetSwitcher被用作home属性,它接受一个routes映射,该映射定义了路由路径到组件的映射。
  3. routes映射中定义了两个路由:'/'对应HomePage组件,'/second'对应SecondPage组件。
  4. initialRoute属性定义了初始路由,即应用启动时加载的页面。
  5. HomePage组件包含一个按钮,点击按钮时会导航到'/second'路由,即SecondPage组件。
  6. SecondPage组件包含一个返回按钮,点击按钮时会返回到上一页(即HomePage组件)。

这样,你就成功地在Flutter应用中使用了routed_widget_switcher插件来实现路由与组件切换。请注意,这个示例假设routed_widget_switcher插件的使用方式与标准的Flutter路由系统兼容,但具体的API和实现细节可能会有所不同,请参考插件的官方文档以获取最新和最准确的信息。

回到顶部