Flutter路由自动生成插件shelf_router_generator的使用

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

Flutter路由自动生成插件shelf_router_generator的使用

简介

pub package package publisher

shelf_router_generator 是一个用于 Dart 的代码生成器,它使得通过注解(annotations)来自动生成 shelf_route.Router 变得简单。这个工具依赖于 Shelfshelf_router,可以让你更方便地构建基于 Shelf 的 Web 应用程序。

为了使用 shelf_router_generator,你需要将其作为开发依赖项添加到你的项目中,并确保你已经安装了 build_runner。以下是具体的配置方法和一个完整的示例demo。

安装与配置

在你的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  shelf: ^0.7.5
  shelf_router: ^0.7.0+1

dev_dependencies:
  shelf_router_generator: ^0.7.0+1
  build_runner: ^1.3.1

然后运行以下命令来获取依赖项:

flutter pub get

示例代码

下面是一个完整的示例,展示了如何使用 shelf_router_generator 来定义路由并生成相应的代码。

main.dart

import 'dart:async' show Future;

import 'package:shelf/shelf.dart';
import 'package:shelf/shelf_io.dart' as shelf_io;
import 'package:shelf_router/shelf_router.dart';

// Generated code will be written to 'main.g.dart'
part 'main.g.dart';

class Service {
  // A handler is annotated with @Route.<verb>('<route>'), the '<route>' may
  // embed URL-parameters, and these may be taken as parameters by the handler.
  // But either all URL-parameters or none of the URL parameters must be taken
  // as parameters by the handler.
  @Route.get('/say-hi/<name>')
  Response _hi(Request request, String name) => Response.ok('hi $name');

  // Embedded URL parameters may also be associated with a regular-expression
  // that the pattern must match.
  @Route.get('/user/<userId|[0-9]+>')
  Response _user(Request request, String userId) =>
      Response.ok('User has the user-number: $userId');

  // Handlers can be asynchronous (returning `FutureOr` is also allowed).
  @Route.get('/wave')
  Future<Response> _wave(Request request) async {
    await Future<void>.delayed(const Duration(milliseconds: 100));
    return Response.ok('_o/');
  }

  // Other routers can be mounted...
  @Route.mount('/api')
  Router get _api => Api().router;

  // You can catch all verbs and use a URL-parameter with a regular expression
  // that matches everything to catch app.
  @Route.all('/<ignored|.*>')
  Response _notFound(Request request) => Response.notFound('Page not found');

  // The generated function _$ServiceRouter can be used to get a [Handler]
  // for this object. This can be used with [shelf_io.serve].
  Handler get handler => _$ServiceRouter(this).call;
}

class Api {
  // A handler can have more than one route :)
  @Route.get('/messages')
  @Route.get('/messages/')
  Future<Response> _messages(Request request) async => Response.ok('[]');

  // This nested catch-all, will only catch /api/.* when mounted above.
  // Notice that ordering if annotated handlers and mounts is significant.
  @Route.all('/<ignored|.*>')
  Response _notFound(Request request) => Response.notFound('null');

  // The generated function _$ApiRouter can be used to expose a [Router] for
  // this object.
  Router get router => _$ApiRouter(this);
}

// Run shelf server and host a [Service] instance on port 8080.
void main() async {
  final service = Service();
  final server = await shelf_io.serve(service.handler, 'localhost', 8080);
  print('Server running on localhost:${server.port}');
}

生成代码

确保你在项目根目录下运行以下命令以生成代码:

flutter pub run build_runner build

这将会根据你在 main.dart 中定义的注解生成 main.g.dart 文件,其中包含了路由逻辑。

总结

通过 shelf_router_generator,你可以轻松地为基于 Shelf 的 Web 应用程序创建和管理路由。只需通过简单的注解方式定义路由,然后使用 build_runner 自动生成路由代码即可。希望这个示例能够帮助你更好地理解和使用 shelf_router_generator。如果有任何问题或需要进一步的帮助,请随时提问!


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

1 回复

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


当然,下面是一个关于如何使用 shelf_router_generator 插件自动生成 Flutter 路由的示例。需要注意的是,shelf_router_generator 并不是 Flutter 社区中广泛使用的插件之一,我假设其功能和类似的路由生成插件(如 flutter_router_generatorauto_route_generator)类似,自动生成路由配置和辅助代码。由于具体实现可能有所不同,这里我将给出一个假设性的实现流程和代码示例。

安装插件

首先,在你的 Flutter 项目中,通过 pubspec.yaml 文件添加 shelf_router_generator 插件(如果实际存在):

dependencies:
  flutter:
    sdk: flutter
  shelf_router_generator: ^x.y.z  # 替换为实际版本号

dev_dependencies:
  build_runner: ^x.y.z  # 假设需要使用 build_runner 来生成代码

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

定义路由

接下来,你需要在项目的某个地方定义你的路由。假设你有一个 routes.dart 文件:

// routes.dart

@RouteConfig(
  routes: [
    Route(path: '/', component: HomePage),
    Route(path: '/details/:id', component: DetailsPage),
    // 更多路由...
  ],
)
class MyRouter {}

这里我们假设 @RouteConfigRouteshelf_router_generator 提供的注解,用于定义路由。

生成路由代码

在定义好路由后,你需要运行代码生成工具来生成路由配置代码。假设使用 build_runner

flutter pub run build_runner build

这条命令将生成一些文件,通常是路由配置文件和辅助代码。假设生成的代码包含在一个 generated 文件夹中。

使用生成的路由

最后,你可以在应用中使用生成的路由代码。假设生成的路由导航文件是 router.g.dart

// main.dart

import 'package:flutter/material.dart';
import 'generated/router.g.dart';  // 导入生成的路由文件

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      onGenerateRoute: MyRouter.generateRoute,  // 使用生成的路由生成函数
    );
  }
}

// 使用路由导航
void navigateToDetails(BuildContext context, String id) {
  Navigator.of(context).pushNamed('/details/$id');
}

在这个示例中,MyRouter.generateRoute 是由 shelf_router_generator 生成的路由生成函数,用于根据路径名生成相应的 Route 对象。

总结

由于 shelf_router_generator 并不是实际存在的插件(基于我的搜索结果),以上代码示例是基于假设和类似插件的工作流程编写的。如果 shelf_router_generator 确实存在且工作原理类似,那么你应该能够按照类似的步骤进行集成和使用。

如果 shelf_router_generator 插件的具体用法不同,请参考其官方文档或仓库中的示例代码进行集成。

回到顶部