Flutter路由管理插件routemaster_conductor的使用

发布于 1周前 作者 zlyuanteng 来自 Flutter

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_conductorroutemaster

示例代码

// 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

1 回复

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


routemaster_conductor 是一个用于 Flutter 的路由管理插件,它基于 routemaster 库,提供了更简单和直观的方式来管理应用的路由和导航。routemaster 本身是一个强大的路由库,支持声明式路由、嵌套路由、参数传递等功能,而 routemaster_conductor 则进一步简化了这些功能的使用。

安装

首先,你需要在 pubspec.yaml 文件中添加 routemasterroutemaster_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'),
        ),
      ),
    );
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!