Flutter网络请求构建插件dio_builder的使用

Flutter网络请求构建插件dio_builder的使用

DioBuilder 是一个 Dart 库,它提供了构建模式来配置和创建 Dio HTTP 客户端的实例。它抽象了常见的配置和拦截器,以便更轻松地设置和使用 Dio 进行网络请求。

安装

在你的 pubspec.yaml 文件中添加 dio_builder

dependencies:
  dio_builder: ^3.0.0 # 替换为最新版本

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

使用

1. 导入必要的库

import 'package:dio_builder/dio_builder.dart';
import 'package:dio/dio.dart';

2. 初始化 DioBuilder

final dioBuilder = DioBuilder();
dioBuilder.initialize();

3. 配置并构建你的 Dio 实例

final dio = dioBuilder
    .setBaseUrl('https://api.example.com') // 设置基础URL
    .setContentType('application/json') // 设置内容类型
    .setHeaders({'Authorization': 'Bearer YOUR_ACCESS_TOKEN'}) // 设置自定义头
    .build();

4. 使用 Dio 实例进行 HTTP 请求

try {
  final response = await dio.get('/some-endpoint'); // 发送 GET 请求
  // 处理响应
} catch (e) {
  // 处理错误
}

配置

DioBuilder 提供了多种方法来配置你的 Dio 实例:

  • setBaseUrl: 设置 API 的基础 URL。
  • setContentType: 设置请求的内容类型。
  • setHeaders: 设置请求的自定义头。
  • setFollowRedirects: 启用或禁用跟随重定向。
  • setExtras: 设置请求的额外选项。
  • setQueryParameters: 设置请求的查询参数。
  • setListFormat: 设置序列化的列表格式。
  • setMethod: 设置请求的 HTTP 方法。
  • setDefaultTimeOut: 设置网络请求的默认超时时间。
  • setResponseType: 设置请求的响应类型。
  • setPersistentConnection: 启用或禁用持久连接。
  • setMaxRedirects: 设置要跟随的最大重定向次数。
  • setReceiveDataWhenStatusError: 设置在状态为错误时是否接收数据。

你可以链式调用这些方法以根据需求配置 DioBuilder。

拦截器

DioBuilder 包含一些默认的拦截器:

  • 日志拦截器:记录 HTTP 请求和响应。
  • 重试拦截器:自动重试失败的请求。

你可以使用 addLoggerallowRetryInFailed 方法添加或移除拦截器。

示例

以下是使用 DioBuilder 发送不同类型请求的一些示例:

GET 请求

final response = await dioBuilder.get(
  endPoint: '/get-endpoint',
  data: {'param1': 'value1'},
);

POST 请求

final response = await dioBuilder.post(
  endPoint: '/post-endpoint',
  data: {'param1': 'value1'},
);

PUT 请求

final response = await dioBuilder.put(
  endPoint: '/put-endpoint',
  data: {'param1': 'value1'},
);

DELETE 请求

final response = await dioBuilder.delete(
  endPoint: '/delete-endpoint',
  data: {'param1': 'value1'},
);

处理响应

你可以通过 response.data 访问响应数据。例如:

final responseData = response.data;

处理错误

如果请求过程中发生错误,它将在 catch 块中被捕获。例如:

try {
  final response = await dioBuilder.get(
    endPoint: '/non-existent-endpoint',
    data: {'param1': 'value1'},
  );
} catch (e) {
  // 处理错误
}

示例代码

以下是一个完整的示例代码,展示了如何使用 DioBuilder 进行网络请求:

import 'dart:async';

import 'package:dio_builder/dio_builder.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

// 示例使用 DioModule 类
void exampleUsage() async {
  final dioClient = DioClient();

  final responseData = await dioClient.getData('/users');
  print(responseData);

  final postData = {
    'name': 'John Doe',
    'email': 'john@example.com',
  };
  final response = await dioClient.postData('/users', postData);
  print(response);
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  [@override](/user/override)
  void initState() {
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('插件示例应用'),
        ),
        body: const Center(
          child: Text('运行于: '),
        ),
      ),
    );
  }
}

class DioClient extends DioBuilder {
  // 自定义方法或属性可以在这里添加

  DioClient() {
    baseUrl = 'https://api.example.com'; // 设置基础URL
    addLogger(); // 添加日志拦截器
    allowRetryInFailed(); // 允许在失败时重试
    setDefaultTimeOut(10); // 设置默认超时时间为10秒
  }

  /// 发送 GET 请求以从指定的 [endpoint] 获取数据。
  /// 返回响应数据作为动态对象。
  Future<dynamic> getData(String endpoint) async {
    try {
      final response = await get(endPoint: endpoint);
      return response.data;
    } catch (e) {
      // 处理错误
      rethrow;
    }
  }

  /// 发送 POST 请求以向指定的 [endpoint] 发送数据。
  /// [data] 参数表示要发送的有效载荷。
  /// 返回响应数据作为动态对象。
  Future<dynamic> postData(String endpoint, dynamic data) async {
    try {
      final response = await post(endPoint: endpoint, data: data);
      return response.data;
    } catch (e) {
      // 处理错误
      rethrow;
    }
  }

  [@override](/user/override)
  void handleOnResponse(
      Response<dynamic> response, ResponseInterceptorHandler handler) {
    // 自定义响应处理逻辑
  }

  [@override](/user/override)
  void handleOnRequest(
      RequestOptions options, RequestInterceptorHandler handler) {
    // 自定义请求处理逻辑
  }

  [@override](/user/override)
  void handleOnError(
      DioException dioException, ErrorInterceptorHandler handler) {
    // 自定义错误处理逻辑
  }

  // 根据需要添加更多方法以支持不同的 HTTP 请求类型和功能
}

更多关于Flutter网络请求构建插件dio_builder的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter网络请求构建插件dio_builder的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


dio_builder 是一个基于 Dio 的网络请求构建插件,它可以帮助你更简洁、更高效地构建和管理网络请求。Dio 是 Dart 语言中一个非常流行的网络请求库,而 dio_builder 则是对 Dio 的一层封装,提供了更加便捷的 API 和功能。

安装 dio_builder

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

dependencies:
  dio_builder: ^1.0.0

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

基本用法

dio_builder 提供了 DioBuilder 类来构建网络请求。你可以通过 DioBuilder 来设置请求的 URL、方法、参数、头部等信息。

import 'package:dio_builder/dio_builder.dart';

void main() async {
  // 创建 DioBuilder 实例
  var dioBuilder = DioBuilder();

  // 发送 GET 请求
  var response = await dioBuilder.get(
    'https://jsonplaceholder.typicode.com/posts/1',
  );

  print(response.data);
}

设置请求参数

你可以通过 queryParameters 设置查询参数,通过 data 设置请求体。

var response = await dioBuilder.get(
  'https://jsonplaceholder.typicode.com/posts',
  queryParameters: {'userId': '1'},
);

var postResponse = await dioBuilder.post(
  'https://jsonplaceholder.typicode.com/posts',
  data: {
    'title': 'foo',
    'body': 'bar',
    'userId': 1,
  },
);

设置请求头

你可以通过 headers 设置请求头。

var response = await dioBuilder.get(
  'https://jsonplaceholder.typicode.com/posts/1',
  headers: {'Authorization': 'Bearer your_token'},
);

拦截器

dio_builder 也支持拦截器,你可以在请求发送前或响应返回后进行一些处理。

dioBuilder.addInterceptor(InterceptorsWrapper(
  onRequest: (options, handler) {
    // 在请求发送前处理
    print('Request: ${options.uri}');
    handler.next(options);
  },
  onResponse: (response, handler) {
    // 在响应返回后处理
    print('Response: ${response.data}');
    handler.next(response);
  },
  onError: (DioError e, handler) {
    // 在请求出错时处理
    print('Error: ${e.message}');
    handler.next(e);
  },
));

错误处理

你可以通过 try-catch 来处理请求中的错误。

try {
  var response = await dioBuilder.get('https://jsonplaceholder.typicode.com/invalid');
  print(response.data);
} catch (e) {
  print('Error: $e');
}

自定义 Dio 实例

如果你需要自定义 Dio 实例,可以通过 DioBuilderdio 属性进行设置。

var dio = Dio(BaseOptions(
  baseUrl: 'https://jsonplaceholder.typicode.com',
  connectTimeout: 5000,
  receiveTimeout: 3000,
));

var dioBuilder = DioBuilder(dio: dio);
回到顶部