Flutter路由生成插件shelf_routing_generator的使用
Flutter路由生成插件shelf_routing_generator的使用
Shelf Routing 是一个用于构建 Dart Web 应用程序的请求处理器组合工具。shelf_routing
包提供了 Shelf 的请求路由器。此包可以通过代码中的注解生成 shelf_router.Router
。
此插件应作为开发依赖项与 build_runner
一起使用,并且需要将 shelf
和 shelf_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);
}
代码解释
-
导入必要的库
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';
-
用户类
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 { 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'); 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
更多关于Flutter路由生成插件shelf_routing_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
shelf_routing_generator
是一个用于生成 Flutter 路由的代码生成插件。它可以帮助你自动生成路由相关的代码,减少手动编写路由配置的工作量。以下是如何使用 shelf_routing_generator
的基本步骤:
1. 添加依赖
首先,在你的 pubspec.yaml
文件中添加 shelf_routing_generator
和 build_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