Flutter路由管理插件routemaster_conductor的使用
Flutter路由管理插件routemaster_conductor的使用
Routemaster Conductor 是一个用于简化 Flutter 路由管理的插件,旨在模仿 Next.js 的路由方式。它支持路径参数、嵌套路由和路由映射切换等功能,同时保持了 Routemaster 提供的接口,并帮助生成样板代码。
动机
我认为这是一个有趣的概念,我的路径通常与文件夹结构一致,而且现有的导航框架已经足够多。
开始使用
安装
首先,在 pubspec.yaml
文件中添加依赖:
flutter pub add dev:build_runner dev:routemaster_conductor
如果需要使用 Routemaster,还需添加:
flutter pub add routemaster
项目结构
我们会在以下目录中检查页面:
.../pages/...
.../page/...
生成的路由会被放置在 lib/src/routes.g.dart
中。(可以通过配置选项覆盖默认路径)
文件夹类型
文件夹 | 类型 | 示例 | 路由 |
---|---|---|---|
pages/<dir>/ | Segment | pages/home/page.dart | /home |
pages/[key]/ | Slug | pages/user/[id]/page.dart | /user/:id |
pages/(name)/ | Group | pages/(admin)/dashboard/page.dart | /dashboard |
文件类型
文件名 | 类型 | 描述 |
---|---|---|
page.dart | Page | 用于定义给定路由的页面 |
template.dart | Template | 用于覆盖 Routemaster 默认的 RouteSettings 工厂 |
404.dart, unknown.dart | Unknown | 用于定义当前路由映射的 404 页面 |
tabs.dart, nested.dart | Nested | 用于定义嵌套路由或标签页路由 |
注意:模板会沿着文件树向下级联,直到找到另一个模板为止。
示例
你可以查看 example/
文件夹中的用法,其中包含每个受支持功能的示例。
配置
在 build.yaml
文件中进行配置:
# build.yaml
targets:
$default:
builders:
routemaster_conductor:
options:
routeMetaComment: true
framework: routemaster
参数 | 描述 | 默认值 | 允许值 | 可空值 |
---|---|---|---|---|
routeMetaComment | 禁用生成路由的元数据注释 | true | true, false | true |
framework | 根据框架生成不同的路由映射,默认为 Routemaster | ‘routemaster’ | ‘routemaster’, null | true |
outputDir | 覆盖默认的 routes.g.dart 输出目录 |
lib/src | 任何相对路径 | true |
特性
- 从文件系统生成路由。
- 支持带有路由占位符的动态路由。
- 路由分组:
- 类似于 Next.js 的分组功能,但我们为每个分组生成一个新的路由映射。
- 支持 Routemaster 的路由映射切换功能。
- 404/未知路由。
- 嵌套路由/标签页路由。
部分支持
- 重定向:
- 我们通过模板部分支持此功能。
- 未来可能会改变。
动态路由
对于动态路由占位符,你可以在页面构造函数中添加字符串参数,我们会假设构造函数参数与路径中的占位符 ID 相同。你也可以通过 Routemaster 访问这些参数。
404/未知路由
每个路由组都有自己的 404 页面,默认使用 Routemaster 的 404 页面。这些工作方式类似于模板。
模板
Routemaster
这些模板是特定于 Routemaster 构建器的。
template.dart
RouteSettings routeTemplate(RouteData routeData, Widget child) {
return // Your code here
}
404.dart
RouteSettings unknownRoute(String path) {
return // Your code here
}
nested.dart
同一目录下的嵌套路由会忽略模板,但子页面会应用模板。
RouteSettings nestedRoute(RouteData routeData, Widget child) {
return // Your code here
}
完整示例
以下是一个完整的示例,展示了如何使用 routemaster_conductor
和 routemaster
。
示例代码
// example/lib/main.dart
import 'package:example/src/routes.g.dart'; // 自动生成的路由文件
import 'package:flutter/material.dart';
import 'package:routemaster/routemaster.dart';
void main() {
runApp(const MainApp());
}
class MainApp extends StatelessWidget {
const MainApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp.router(
routerDelegate: RoutemasterDelegate(routesBuilder: (_) => routeMap), // 使用自动生成的路由映射
routeInformationParser: const RoutemasterParser(), // 使用 Routemaster 的解析器
);
}
}
更多关于Flutter路由管理插件routemaster_conductor的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter路由管理插件routemaster_conductor的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
routemaster_conductor
是一个用于 Flutter 的路由管理插件,它基于 routemaster
库,提供了更简单和直观的方式来管理应用的路由和导航。routemaster
本身是一个强大的路由库,支持声明式路由、嵌套路由、参数传递等功能,而 routemaster_conductor
则进一步简化了这些功能的使用。
安装
首先,你需要在 pubspec.yaml
文件中添加 routemaster
和 routemaster_conductor
依赖:
dependencies:
flutter:
sdk: flutter
routemaster: ^1.0.0
routemaster_conductor: ^1.0.0
然后运行 flutter pub get
来安装依赖。
基本使用
1. 定义路由
首先,你需要定义应用的路由。routemaster
使用 RouteMap
来定义路由表。
import 'package:routemaster/routemaster.dart';
import 'package:flutter/material.dart';
final routes = RouteMap(
routes: {
'/': (_) => MaterialPage(child: HomePage()),
'/details': (_) => MaterialPage(child: DetailsPage()),
},
);
class HomePage extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Home')),
body: Center(
child: ElevatedButton(
onPressed: () {
Routemaster.of(context).push('/details');
},
child: Text('Go to Details'),
),
),
);
}
}
class DetailsPage extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Details')),
body: Center(
child: ElevatedButton(
onPressed: () {
Routemaster.of(context).pop();
},
child: Text('Go back'),
),
),
);
}
}
2. 使用 routemaster_conductor
routemaster_conductor
提供了一个 Conductor
类,它可以帮助你更简单地管理路由。
import 'package:flutter/material.dart';
import 'package:routemaster/routemaster.dart';
import 'package:routemaster_conductor/routemaster_conductor.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp.router(
routerDelegate: RoutemasterDelegate(
routesBuilder: (context) => routes,
),
routeInformationParser: RoutemasterParser(),
builder: (context, child) {
return Conductor(
child: child!,
);
},
);
}
}
3. 导航
你可以使用 Routemaster.of(context)
来进行导航:
Routemaster.of(context).push('/details');
或者使用 Conductor
提供的 navigate
方法:
Conductor.of(context).navigate('/details');
高级功能
嵌套路由
routemaster
支持嵌套路由,你可以在 RouteMap
中定义嵌套路由:
final routes = RouteMap(
routes: {
'/': (_) => MaterialPage(child: HomePage()),
'/profile': (_) => MaterialPage(child: ProfilePage()),
'/profile/settings': (_) => MaterialPage(child: SettingsPage()),
},
);
参数传递
你可以通过路由传递参数:
Routemaster.of(context).push('/details?id=123');
然后在目标页面中获取参数:
class DetailsPage extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
final id = Routemaster.of(context).currentRoute.queryParameters['id'];
return Scaffold(
appBar: AppBar(title: Text('Details $id')),
body: Center(
child: ElevatedButton(
onPressed: () {
Routemaster.of(context).pop();
},
child: Text('Go back'),
),
),
);
}
}