Flutter路由生成插件shelf_routing_generator的使用

Flutter路由生成插件shelf_routing_generator的使用

Shelf Routing 是一个用于构建 Dart Web 应用程序的请求处理器组合工具。shelf_routing 包提供了 Shelf 的请求路由器。此包可以通过代码中的注解生成 shelf_router.Router

此插件应作为开发依赖项与 build_runner 一起使用,并且需要将 shelfshelf_routing 作为依赖项。

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

一旦代码被如下的示例所示进行注解,可以通过运行 pub run build_runner build 来生成对应的部分。

示例

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

// 生成的文件
import 'example.routers.dart';

// 生成的文件
part 'example.g.dart';

class User {
  final int id;
  final String name;

  const User({
    required this.id,
    required this.name,
  });

  factory User.fromJson(Map<String, dynamic> map) => User(id: map['id'], name: map['name']);
  Map<String, dynamic> toJson() => {'id': id, 'name': name};
}

// 使用 Routable 注解来定义路由前缀
[@Routable](/user/Routable)(prefix: '/users')
class UserController {
  // 创建路由器,使用在 'example.g.dart' 中定义的生成函数。
  static Router get router => _$userControllerRouter;

  final DatabaseConnection connection;

  UserController(this.connection);

  // 定义GET方法路由
  [@Route](/user/Route).get('/')
  Future<List<dynamic>> listUsers(Request request, {String? query}) async {
    return ['user1'];
  }

  // 定义带有参数的GET方法路由
  [@Route](/user/Route).get('/<userId>')
  Future<Response> fetchUser(Request request, int userId) async {
    if (userId == 1) {
      return Response.ok('user1');
    }
    return Response.notFound('no such user');
  }

  // 定义POST方法路由
  [@Route](/user/Route).post('/')
  Future<JsonResponse<User>> createUser(Request request, User user) async {
    if (user.name.isEmpty) {
      return JsonResponse.badRequest(body: 'Missing name field');
    }
    return JsonResponse.ok(user);
  }
}

// 使用生成函数创建路由器
[@GenerateRouterFor](/user/GenerateRouterFor)([UserController])
Router get apiRouter => _$apiRouter;

void main() async {
  // 可以在此处设置上下文、数据库连接、缓存连接等。
  final connection = await DatabaseConnection.connect('localhost:1234');

  // 定义一个注入控制器的方法。
  // 可以使用 get_it 包。
  T get<T extends Object>(Request request) {
    return UserController(connection) as T;
  }

  // 使用路由器处理请求,注意路由器也可以被挂载。
  final handler = const Pipeline().addMiddleware(getterMiddleware(get)).addHandler(apiRouter);
  await serve(handler, 'localhost', 8080);
}

代码解释

  1. 导入必要的库

    import 'package:shelf/shelf.dart';
    import 'package:shelf/shelf_io.dart';
    import 'package:shelf_router/shelf_router.dart';
    import 'package:shelf_routing/shelf_routing.dart';
    
  2. 生成的文件

    import 'example.routers.dart';
    
  3. 用户类

    class User {
      final int id;
      final String name;
    
      const User({
        required this.id,
        required this.name,
      });
    
      factory User.fromJson(Map<String, dynamic> map) => User(id: map['id'], name: map['name']);
      Map<String, dynamic> toJson() => {'id': id, 'name': name};
    }
    
  4. 使用 Routable 注解来定义路由前缀

    [@Routable](/user/Routable)(prefix: '/users')
    class UserController {
      static Router get router => _$userControllerRouter;
    
      final DatabaseConnection connection;
    
      UserController(this.connection);
    
  5. 定义 GET 方法路由

    [@Route](/user/Route).get('/')
    Future<List<dynamic>> listUsers(Request request, {String? query}) async {
      return ['user1'];
    }
    
  6. 定义带有参数的 GET 方法路由

    [@Route](/user/Route).get('/<userId>')
    Future<Response> fetchUser(Request request, int userId) async {
      if (userId == 1) {
        return Response.ok('user1');
      }
      return Response.notFound('no such user');
    }
    
  7. 定义 POST 方法路由

    [@Route](/user/Route).post('/')
    Future<JsonResponse<User>> createUser(Request request, User user) async {
      if (user.name.isEmpty) {
        return JsonResponse.badRequest(body: 'Missing name field');
      }
      return JsonResponse.ok(user);
    }
    
  8. 使用生成函数创建路由器

    [@GenerateRouterFor](/user/GenerateRouterFor)([UserController])
    Router get apiRouter => _$apiRouter;
    
  9. 主函数

    void main() async {
      final connection = await DatabaseConnection.connect('localhost:1234');
    
      T get<T extends Object>(Request request) {
        return UserController(connection) as T;
      }
    
      final handler = const Pipeline().addMiddleware(getterMiddleware(get)).addHandler(apiRouter);
      await serve(handler, 'localhost', 8080);
    }
    

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

1 回复

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


shelf_routing_generator 是一个用于生成 Flutter 路由的代码生成插件。它可以帮助你自动生成路由相关的代码,减少手动编写路由配置的工作量。以下是如何使用 shelf_routing_generator 的基本步骤:

1. 添加依赖

首先,在你的 pubspec.yaml 文件中添加 shelf_routing_generatorbuild_runner 依赖:

dependencies:
  flutter:
    sdk: flutter
  shelf_routing: ^0.8.0

dev_dependencies:
  build_runner: ^2.1.0
  shelf_routing_generator: ^0.8.0

2. 创建路由配置

在你的项目中创建一个 Dart 文件(例如 routes.dart),并使用 shelf_routing@Route 注解来定义路由。

import 'package:shelf_routing/shelf_routing.dart';
import 'package:flutter/material.dart';
import 'home_page.dart';
import 'about_page.dart';

@Route(
  path: '/',
  page: MaterialPage(child: HomePage()),
)
class HomeRoute {}

@Route(
  path: '/about',
  page: MaterialPage(child: AboutPage()),
)
class AboutRoute {}

3. 生成路由代码

运行 build_runner 来生成路由代码:

flutter pub run build_runner build

这将会生成一个 .g.dart 文件(例如 routes.g.dart),其中包含了自动生成的路由配置代码。

4. 使用生成的路由

在你的 Flutter 应用中使用生成的路由配置。例如,在 main.dart 中:

import 'package:flutter/material.dart';
import 'routes.dart' as generated_routes;

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      onGenerateRoute: generated_routes.onGenerateRoute,
      initialRoute: '/',
    );
  }
}

5. 运行应用

现在你可以运行你的 Flutter 应用,并导航到定义的路由。

6. 更新路由

如果你在 routes.dart 中添加或修改了路由配置,只需再次运行 build_runner 来重新生成路由代码。

flutter pub run build_runner build
回到顶部