Flutter路由注解插件revali_router_annotations的使用

Flutter路由注解插件revali_router_annotations的使用

介绍

revali_router_annotationsrevali_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

1 回复

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


revali_router_annotations 是一个用于 Flutter 的路由注解插件,它通过注解的方式简化了路由的定义和跳转。使用该插件,你可以通过注解来定义路由,而不需要手动编写路由表。以下是如何使用 revali_router_annotations 的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 revali_router_annotationsbuild_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 中,使用生成的路由表来配置 MaterialApproutesonGenerateRoute

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'});
回到顶部