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()
永远不会抛出异常。- 每个拦截器的操作不受其他拦截器的影响。但是,拦截器的输入可以被它之前的拦截器更改。
onRequest
和onTransform
回调将始终被调用。- 如果请求返回结果,则所有
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
更多关于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
并重写 onBefore
、onAfter
和 onError
方法来添加自定义逻辑。
示例
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');
}