Flutter路由注解插件revali_router_annotations的使用
Flutter路由注解插件revali_router_annotations的使用
介绍
revali_router_annotations
是 revali_router
包的基础注解包。它提供了用于在 Revali 中定义控制器和端点的核心注解。
使用文档
要了解更多关于如何使用 Revali 的信息,请查看其官方文档。
示例代码
// ignore_for_file: avoid_print
import 'dart:io';
import 'package:revali_router/revali_router.dart';
void main() async {
// 绑定服务器到 localhost:8080
final server = await HttpServer.bind(
'localhost',
8080,
);
// 处理请求
handleRequests(server, (context) async {
// 初始化路由器
final router = Router(
routes: routes,
reflects: {
Reflect(
User,
metas: (m) {
m['user'].add(const Role('admin'));
},
),
},
);
// 处理路由请求并返回响应
final response = await router.handle(context);
return response;
}).ignore();
// 打印服务地址
print('Serving at http://${server.address.host}:${server.port}');
}
// 定义路由
final routes = [
Route(
'', // 路由路径
method: 'GET', // HTTP 方法
handler: (context) async {}, // 请求处理器
),
Route(
'user', // 路由路径
catchers: [AuthExceptionCatcher()], // 异常捕获器
routes: [
Route(
':id', // 路由路径
catchers: const [], // 异常捕获器
guards: const [AuthGuard()], // 守卫
handler: (context) async {
// 设置响应状态码和响应体
context.response.statusCode = 200;
context.response.body = {'id': 'hi'};
},
interceptors: const [BodyInterceptor()], // 拦截器
meta: (m) {}, // 元数据
method: 'GET', // HTTP 方法
middlewares: [AddAuth()], // 中间件
routes: const [], // 子路由
),
Route(
'', // 路由路径
method: 'POST', // HTTP 方法
handler: (context) async {
// 获取请求体
final body = context.request.body;
print(body);
// 设置响应状态码和响应体
context.response.statusCode = 200;
context.response.body = {'id': 'hi'};
},
),
],
),
];
// 定义守卫
class AuthGuard implements Guard {
const AuthGuard();
[@override](/user/override)
Future<GuardResult> canActivate(
GuardContext context,
GuardAction canActivate,
) async {
// 获取上下文数据中的认证信息
final hasAuth = context.data.get<HasAuth>();
// 如果认证信息不存在,则抛出异常
if (hasAuth case null) {
throw AuthException();
}
// 如果认证失败,则返回拒绝
if (!hasAuth.hasAuth) {
return canActivate.no();
}
// 如果认证成功,则返回允许
return canActivate.yes();
}
}
// 定义中间件
class AddAuth implements Middleware {
[@override](/user/override)
Future<MiddlewareResult> use(
MiddlewareContext context,
MiddlewareAction action,
) async {
// 添加认证信息
context.data.add(HasAuth(hasAuth: true));
// 继续执行下一个中间件
return action.next();
}
}
// 定义认证信息类
class HasAuth {
HasAuth({required this.hasAuth});
final bool hasAuth;
}
// 定义认证异常类
class AuthException implements Exception {}
// 定义异常捕获器
class AuthExceptionCatcher extends ExceptionCatcher<AuthException> {
[@override](/user/override)
ExceptionCatcherResult catchException(
AuthException e,
ExceptionCatcherContext context,
ExceptionCatcherAction action,
) {
// 处理异常,设置响应状态码和响应体
return action.handled(
statusCode: 401,
body: 'Unauthorized',
);
}
}
// 定义用户类
class User {
const User(this.name);
final String name;
}
// 定义角色类
class Role {
const Role(this.name);
final String name;
}
// 定义拦截器
class BodyInterceptor implements Interceptor {
const BodyInterceptor();
[@override](/user/override)
Future<void> post(InterceptorContext context) async {
// 在请求后处理操作
final reflect = context.reflect.get<User>();
reflect?.meta.entries;
reflect?.meta['user']?.has<Role>();
}
[@override](/user/override)
Future<void> pre(InterceptorContext context) async {
// 在请求前处理操作
}
}
更多关于Flutter路由注解插件revali_router_annotations的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter路由注解插件revali_router_annotations的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
revali_router_annotations
是一个用于 Flutter 的路由注解插件,它通过注解的方式简化了路由的定义和跳转。使用该插件,你可以通过注解来定义路由,而不需要手动编写路由表。以下是如何使用 revali_router_annotations
的基本步骤:
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 revali_router_annotations
和 build_runner
依赖:
dependencies:
flutter:
sdk: flutter
revali_router_annotations: ^0.0.1
dev_dependencies:
build_runner: ^2.1.0
revali_router_generator: ^0.0.1
2. 创建路由页面
接下来,你可以创建一个普通的 Flutter 页面,并使用 @RevaliRoute
注解来标记它。
import 'package:flutter/material.dart';
import 'package:revali_router_annotations/revali_router_annotations.dart';
@RevaliRoute(path: '/home')
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Home Page'),
),
body: Center(
child: Text('Welcome to the Home Page!'),
),
);
}
}
3. 生成路由代码
使用 build_runner
生成路由代码。在终端中运行以下命令:
flutter pub run build_runner build
这将会生成一个 router.dart
文件,其中包含了自动生成的路由表。
4. 使用生成的路由表
在 main.dart
中,使用生成的路由表来配置 MaterialApp
的 routes
或 onGenerateRoute
。
import 'package:flutter/material.dart';
import 'router.dart'; // 导入生成的路由表
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Revali Router Example',
onGenerateRoute: onGenerateRoute, // 使用生成的路由表
initialRoute: '/home',
);
}
}
5. 路由跳转
你可以使用 Navigator.pushNamed
来进行路由跳转:
Navigator.pushNamed(context, '/home');
6. 传递参数
revali_router_annotations
支持传递参数。你可以在注解中定义参数,并在跳转时传递:
@RevaliRoute(path: '/details')
class DetailsPage extends StatelessWidget {
final String id;
DetailsPage({required this.id});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Details Page'),
),
body: Center(
child: Text('Details for item $id'),
),
);
}
}
在跳转时传递参数:
Navigator.pushNamed(context, '/details', arguments: {'id': '123'});