Flutter异步操作拦截插件future_interceptor的使用

Flutter异步操作拦截插件future_interceptor的使用

动机

将任务分解为更小、独立的操作单元(拦截器)。

通过创建新的拦截器轻松为应用程序添加新功能。

由于拦截器之间不依赖,因此易于修改和升级。

提高代码重用率。

自动捕获所有异常。

特性

  • onRequest: 允许监控和修改输入请求。
  • onResponse: 允许监控和修改响应数据。
  • onError: 允许监控和修改错误。
  • onTransform: 允许在返回调用者之前修改 FutureResponse
  • extra: 可稍后检索的自定义字段。
  • 扩展:一种向拦截器添加特定功能的方法。

使用方法

/// 创建你的拦截器

class LoggingInterceptor extends Interceptor {

  @override
  InterceptorRequestCallback? get onRequest => (options) {
    print("onRequest");
    return options;
  };

  @override
  InterceptorDataCallback? get onResponse => (options, data) {
    print("onResponse with data $data");
    return data;
  };

  @override
  InterceptorErrorCallback? get onError => (options, error) {
    print("onError $error");
    return error;
  };

  @override
  InterceptorTransformCallback? get onTransform => (response) {
    print("onTransform response $response");
    return response;
  };
}

/// 创建一个设置拦截器并暴露fetch方法的类

class MyClass {
  late FutureInterceptor _futureInterceptor;

  MyClass() {
    _futureInterceptor = FutureInterceptor();
    _futureInterceptor.interceptors.add(LoggingInterceptor());
  }

  Future<FutureResponse<dynamic>> fetch(FetchMethod request) async {
    return _futureInterceptor.fetch(FutureRequestOptions(
      request: request,
      extra: {'key': 'val'},
    ));
  }
}

/// 最终使用

Future<void> test() async {
  final myClass = MyClass();
  final res = await myClass.fetch(() async {
    // 在这里执行你的工作
    return "my result";
  });
  if (res.error != null) {
    print("Error: ${res.error}");
  } else {
    print("Response: ${res.data}");
  }
}

规则

  • FutureInterceptor.fetch() 永远不会抛出异常。
  • 每个拦截器的操作不受其他拦截器的影响。但是,拦截器的输入可以被它之前的拦截器更改。
  • onRequestonTransform 回调将始终被调用。
  • 如果请求返回结果,则所有 onResponse 回调将被调用。
  • 如果请求抛出异常,则所有 onError 回调将被调用。
  • 如果回调抛出异常,则会被忽略。

扩展

RecordExtension

RecordExtension 用于为每个请求存储唯一的数据。

FutureRequestOptions 不同,记录不能被其他拦截器修改。

记录在请求之间不共享。

示例:

class InterceptorWithRecord extends Interceptor with RecordExtension {
  int id = 0;

  @override
  InterceptorRequestCallback get onRequest => (option) {
    setRecord(id++);
    return option;
  };

  @override
  InterceptorDataCallback get onResponse => (option, data) {
    /// 显示由此请求的前一个回调设置的数据。
    print('Record = $record');
    return data;
  };
}

更多关于Flutter异步操作拦截插件future_interceptor的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter异步操作拦截插件future_interceptor的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


future_interceptor 是一个 Flutter 插件,用于拦截和处理异步操作(Future)。它允许你在 Future 执行之前、之后或发生异常时执行自定义逻辑。这对于日志记录、错误处理、性能监控等场景非常有用。

安装

首先,你需要在 pubspec.yaml 文件中添加 future_interceptor 依赖:

dependencies:
  flutter:
    sdk: flutter
  future_interceptor: ^1.0.0

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

基本用法

future_interceptor 的核心是通过 FutureInterceptor 类来拦截 Future。你可以通过继承 FutureInterceptor 并重写 onBeforeonAfteronError 方法来添加自定义逻辑。

示例

import 'package:future_interceptor/future_interceptor.dart';

class MyInterceptor extends FutureInterceptor {
  [@override](/user/override)
  FutureOr<dynamic> onBefore(FunctionInfo info) {
    print('Before executing: ${info.functionName}');
    return super.onBefore(info);
  }

  [@override](/user/override)
  FutureOr<dynamic> onAfter(FunctionInfo info, dynamic result) {
    print('After executing: ${info.functionName}, Result: $result');
    return super.onAfter(info, result);
  }

  [@override](/user/override)
  FutureOr<dynamic> onError(FunctionInfo info, dynamic error, StackTrace stackTrace) {
    print('Error executing: ${info.functionName}, Error: $error');
    return super.onError(info, error, stackTrace);
  }
}

void main() async {
  final interceptor = MyInterceptor();

  final future = Future(() => 42).intercept(interceptor);

  final result = await future;
  print('Final result: $result');
}
回到顶部