Flutter网络扩展插件tbib_dio_extension的使用
Flutter网络扩展插件tbib_dio_extension的使用
导入
import 'package:tbib_dio_extension/tbib_dio_extension.dart';
如何使用
在仓库中使用
if (await networkInfo.isConnected) {
try {
var res = await appServicesClient.getSettings();
if (res.isSuccess) {
return Success(res.toModel);
} else {
return Error(Failure(res.statusCode, res.errorMessage));
}
} catch (error) {
return Error(FailureHandler.handle(error).failure);
}
} else {
// 失败
// 返回左侧错误
return Error(DataSource.NO_INTERNET_CONNECTION.getFailure());
}
在任何地方使用
// 在 main 中移除在 v 1.0.0 中baseUrl 可选
DioManger.init(baseUrl: 'baseUrl');
// 为自定义选项初始化 DioManager
DioManger.initWithCustomOption();
// 获取 Dio
var dio = DioManger.dioApi;
// 调用 API
try {
var res = await dio.post('endpoint');
} catch (error) {
// 从 Dio 获取错误
ErrorHandler.handle(error).failure.messages;
}
// 你可以从 API 获取错误
// 示例 API 响应
{
"result": null,
"errorMessage": "Invalid userName Or Password",
}
示例代码
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:tbib_dio_extension/tbib_dio_extension.dart';
void main() {
DioManger.init();
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
// 这个 widget 是你应用程序的根。
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
// 这是你应用程序的主题。
//
// 尝试运行你的应用程序与 "flutter run"。你会看到一个蓝色的工具栏。然后,不退出应用程序的情况下,尝试将 primarySwatch 下面的颜色更改为 Colors.green 并重新加载。
// 注意到计数器没有重置回零;应用程序没有重启。
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'Demo'),
);
}
}
class MyHomePage extends StatefulWidget {
final String title;
const MyHomePage({super.key, required this.title});
[@override](/user/override)
State<MyHomePage> createState() => _MyHomePageState();
}
class TokenInterceptor extends Interceptor {
[@override](/user/override)
Future<void> onError(
DioException err,
ErrorInterceptorHandler handler,
) async {
if (err.response?.statusCode == 403 || err.response?.statusCode == 401) {
// 移除缓存登录并导航至登录页面
}
super.onError(err, handler);
}
[@override](/user/override)
Future<void> onRequest(
RequestOptions options,
RequestInterceptorHandler handler,
) async {
// 获取用户令牌并发送到头部
super.onRequest(options, handler);
}
[@override](/user/override)
Future<void> onResponse(
Response response,
ResponseInterceptorHandler handler,
) async {
super.onResponse(response, handler);
}
}
class _MyHomePageState extends State<MyHomePage> {
[@override](/user/override)
Widget build(BuildContext context) {
// 每次 setState 被调用时,这个方法都会被重新运行,例如通过 _incrementCounter 方法上面。
//
// Flutter 框架已经优化了重新构建 build 方法的速度,因此你可以只更新需要更新的任何东西而不是单独更改 widget 的实例。
return Scaffold(
appBar: AppBar(
// 这里我们从 MyHomePage 对象中获取标题,并将其设置为应用栏的标题。
title: Text(widget.title),
),
// 这个尾部逗号使自动格式化更友好于 build 方法。
);
void getDataApi() async {
var dio = DioManger.dioApi;
try {
debugPrint("dio url is ${(dio.options.baseUrl)}");
var res = await dio.post('/endpoint', data: {});
debugPrint("dio url is ${res.realUri}");
res.data;
} catch (error) {
debugPrint(
"error catch is ${ErrorHandler.handle(error, messageFromApi: (error is DioException) ? error.response?.data['errorMessage'] : null).failure.messages}");
}
}
[@override](/user/override)
void initState() {
getDataApi();
super.initState();
}
}
}
更多关于Flutter网络扩展插件tbib_dio_extension的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复
更多关于Flutter网络扩展插件tbib_dio_extension的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用tbib_dio_extension
网络扩展插件的示例代码。tbib_dio_extension
是基于dio
库的一个扩展插件,用于简化网络请求并增加一些额外的功能。
1. 添加依赖
首先,在你的pubspec.yaml
文件中添加tbib_dio_extension
和dio
的依赖:
dependencies:
flutter:
sdk: flutter
dio: ^4.0.0
tbib_dio_extension: ^最新版本号 # 请替换为实际最新版本号
然后运行flutter pub get
来安装依赖。
2. 初始化插件
在你的项目中创建一个dio实例,并使用tbib_dio_extension
进行扩展。
import 'package:dio/dio.dart';
import 'package:tbib_dio_extension/tbib_dio_extension.dart';
class HttpClient {
static final HttpClient _instance = HttpClient._();
Dio _dio;
factory HttpClient() => _instance;
HttpClient._() {
BaseOptions options = BaseOptions(
baseUrl: "https://api.example.com", // 替换为你的API基础URL
connectTimeout: 5000,
receiveTimeout: 3000,
);
_dio = Dio(options)
..interceptors.add(LogInterceptor(
requestBody: true,
responseBody: true,
))
..transformers.add(JsonTransformer())
..extendWith(DioExtension()); // 添加tbib_dio_extension扩展
}
Dio get dio => _dio;
}
3. 使用扩展功能
tbib_dio_extension
提供了一些便捷方法来处理请求和响应。下面是一个简单的GET请求示例:
import 'package:flutter/material.dart';
import 'package:dio/dio.dart';
import 'package:tbib_dio_extension/tbib_dio_extension.dart';
import 'http_client.dart'; // 导入上面创建的HttpClient类
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Flutter Dio Extension Demo'),
),
body: Center(
child: FutureBuilder<Map<String, dynamic>>(
future: fetchData(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasError) {
return Text('Error: ${snapshot.error}');
} else {
return Text('Data: ${snapshot.data?['data']}');
}
} else {
return CircularProgressIndicator();
}
},
),
),
),
);
}
Future<Map<String, dynamic>> fetchData() async {
try {
Response<Map<String, dynamic>> response = await HttpClient().dio.get('/endpoint'); // 替换为你的实际API端点
return response.data;
} catch (e) {
throw e;
}
}
}
4. 处理错误和重试逻辑(可选)
tbib_dio_extension
可能提供了一些内置的错误处理和重试逻辑,但具体实现取决于插件的版本和功能。如果需要自定义,你可以结合dio的拦截器来实现。
例如,添加一个简单的重试拦截器:
class RetryInterceptor extends Interceptor {
@override
Future onRequest(RequestOptions options) async {
return options; // 你可以在这里修改请求选项
}
@override
Future onResponse(Response response) async {
return response; // 你可以在这里处理响应数据
}
@override
Future onError(DioError err) async {
// 判断错误类型,如果是可重试错误,则重试请求
if (err.type == DioErrorType.CONNECT_TIMEOUT || err.type == DioErrorType.RECEIVE_TIMEOUT) {
return err.requestOptions.retry(count: 2); // 最大重试次数为2
} else {
throw err; // 不可重试错误,抛出异常
}
}
}
// 在HttpClient类中注册拦截器
_dio.interceptors.add(RetryInterceptor());
以上代码展示了如何在Flutter项目中使用tbib_dio_extension
插件进行网络请求。请确保查看插件的官方文档以获取最新的功能和API信息。