Flutter网络请求服务插件dio_api_services的使用

Flutter网络请求服务插件dio_api_services的使用

本项目是一个用于Dio的API服务的Flutter插件包。该插件包包含适用于Android和/或iOS的平台特定实现代码。

开始使用

要开始使用此插件,首先需要将其添加到你的pubspec.yaml文件中:

dependencies:
  dio_api_services: ^x.x.x

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

可用功能

以下是一些可用的功能及其状态:

功能 状态
API Helper ✔️
Logger ✔️
Smart Retry ✔️

更多示例

更多代码示例可以在example文件夹中找到。

示例代码

以下是使用dio_api_services插件的基本示例代码:

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

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Dio API Services',
      theme: ThemeData(
        useMaterial3: false,
      ),
      home: const HomeScreen(),
    );
  }
}

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

  @override
  State<HomeScreen> createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  // 初始化DioApiService实例并设置基础URL
  static DioApiService apiService = DioApiService(baseUrl: 'https://jsonplaceholder.typicode.com/');

  // 定义一个方法来执行GET请求
  Future<Response> methodGET() async {
    var response = await apiService.call(
      'users',
      method: MethodRequest.GET,
    );
    return response;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Dio API Services'),
      ),
      body: Center(
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.center,
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            // 添加一个按钮,点击时调用methodGET方法
            ElevatedButton(
              onPressed: () async {
                await methodGET();
              },
              child: const Text('启用'),
            ),
          ],
        ),
      ),
    );
  }
}

代码解释

  1. 导入必要的库

    import 'package:dio_api_services/dio_api_services.dart';
    import 'package:flutter/material.dart';
    
  2. 创建应用入口点

    void main() {
      runApp(const MyApp());
    }
    
  3. 定义应用主题和主页

    class MyApp extends StatelessWidget {
      const MyApp({super.key});
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Dio API Services',
          theme: ThemeData(
            useMaterial3: false,
          ),
          home: const HomeScreen(),
        );
      }
    }
    
  4. 定义主页状态管理类

    class HomeScreen extends StatefulWidget {
      const HomeScreen({super.key});
    
      @override
      State<HomeScreen> createState() => _HomeScreenState();
    }
    
  5. 定义主页状态类

    class _HomeScreenState extends State<HomeScreen> {
      // 初始化DioApiService实例并设置基础URL
      static DioApiService apiService = DioApiService(baseUrl: 'https://jsonplaceholder.typicode.com/');
    
      // 定义一个方法来执行GET请求
      Future<Response> methodGET() async {
        var response = await apiService.call(
          'users',
          method: MethodRequest.GET,
        );
        return response;
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: const Text('Dio API Services'),
          ),
          body: Center(
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.center,
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                // 添加一个按钮,点击时调用methodGET方法
                ElevatedButton(
                  onPressed: () async {
                    await methodGET();
                  },
                  child: const Text('启用'),
                ),
              ],
            ),
          ),
        );
      }
    }
    

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

1 回复

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


dio_api_services 是一个基于 Dio 的 Flutter 网络请求服务插件,它简化了网络请求的配置和管理。Dio 是一个非常强大的 Dart HTTP 客户端,支持拦截器、全局配置、FormData、文件上传下载等功能。dio_api_services 进一步封装了这些功能,使得开发者可以更加便捷地进行网络请求。

安装

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

dependencies:
  flutter:
    sdk: flutter
  dio_api_services: ^1.0.0  # 请检查最新版本

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

基本用法

1. 创建 ApiService 实例

import 'package:dio_api_services/dio_api_services.dart';

final apiService = ApiService(
  baseUrl: 'https://jsonplaceholder.typicode.com',
  interceptors: [
    LogInterceptor(), // 添加日志拦截器
  ],
);

2. 发送 GET 请求

Future<void> fetchPosts() async {
  try {
    final response = await apiService.get('/posts');
    print(response.data);
  } catch (e) {
    print('Error: $e');
  }
}

3. 发送 POST 请求

Future<void> createPost() async {
  try {
    final response = await apiService.post(
      '/posts',
      data: {
        'title': 'foo',
        'body': 'bar',
        'userId': 1,
      },
    );
    print(response.data);
  } catch (e) {
    print('Error: $e');
  }
}

4. 发送 PUT 请求

Future<void> updatePost() async {
  try {
    final response = await apiService.put(
      '/posts/1',
      data: {
        'id': 1,
        'title': 'foo',
        'body': 'bar',
        'userId': 1,
      },
    );
    print(response.data);
  } catch (e) {
    print('Error: $e');
  }
}

5. 发送 DELETE 请求

Future<void> deletePost() async {
  try {
    final response = await apiService.delete('/posts/1');
    print(response.data);
  } catch (e) {
    print('Error: $e');
  }
}

拦截器

Dio 支持拦截器,可以在请求发送前或响应返回后进行一些操作。dio_api_services 也支持添加拦截器。

final apiService = ApiService(
  baseUrl: 'https://jsonplaceholder.typicode.com',
  interceptors: [
    InterceptorsWrapper(
      onRequest: (options, handler) {
        // 在请求发送前做一些处理
        options.headers['Authorization'] = 'Bearer token';
        return handler.next(options);
      },
      onResponse: (response, handler) {
        // 在响应返回后做一些处理
        return handler.next(response);
      },
      onError: (DioError e, handler) {
        // 在请求出错时做一些处理
        return handler.next(e);
      },
    ),
    LogInterceptor(), // 添加日志拦截器
  ],
);

文件上传

dio_api_services 也支持文件上传。

Future<void> uploadFile() async {
  try {
    final file = File('path/to/file');
    final response = await apiService.post(
      '/upload',
      data: FormData.fromMap({
        'file': await MultipartFile.fromFile(file.path, filename: 'upload.txt'),
      }),
    );
    print(response.data);
  } catch (e) {
    print('Error: $e');
  }
}

全局配置

你可以通过 ApiService 的构造函数来配置全局的 Dio 实例。

final apiService = ApiService(
  baseUrl: 'https://jsonplaceholder.typicode.com',
  connectTimeout: 5000, // 连接超时时间
  receiveTimeout: 3000, // 接收超时时间
  interceptors: [
    LogInterceptor(), // 添加日志拦截器
  ],
);

错误处理

dio_api_services 默认会捕获 DioError,你可以通过 try-catch 来处理错误。

Future<void> fetchPosts() async {
  try {
    final response = await apiService.get('/posts');
    print(response.data);
  } on DioError catch (e) {
    if (e.response != null) {
      print('Error status code: ${e.response!.statusCode}');
      print('Error data: ${e.response!.data}');
    } else {
      print('Error: $e');
    }
  } catch (e) {
    print('Error: $e');
  }
}
回到顶部