Flutter网络请求插件yjy_dio_5_4_0的使用

Flutter网络请求插件yjy_dio_5_4_0的使用

在Flutter开发中,网络请求是一个非常常见的需求。本文将详细介绍如何使用yjy_dio_5_4_0插件来完成网络请求,并通过完整的示例代码帮助您快速上手。


安装插件

首先,在您的pubspec.yaml文件中添加dio依赖:

dependencies:
  dio: ^5.4.0

然后运行以下命令以安装依赖:

flutter pub get

基本用法

GET 请求

以下是一个简单的GET请求示例:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text("Dio GET Example")),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              try {
                final dio = Dio(); // 创建 Dio 实例
                final response = await dio.get('https://jsonplaceholder.typicode.com/posts/1');
                print(response.data); // 打印返回数据
              } catch (e) {
                print('Error: $e'); // 捕获并打印错误
              }
            },
            child: Text("发起GET请求"),
          ),
        ),
      ),
    );
  }
}

POST 请求

以下是一个POST请求示例:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text("Dio POST Example")),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              try {
                final dio = Dio(); // 创建 Dio 实例
                final response = await dio.post(
                  'https://jsonplaceholder.typicode.com/posts',
                  data: {"title": "foo", "body": "bar", "userId": 1},
                );
                print(response.data); // 打印返回数据
              } catch (e) {
                print('Error: $e'); // 捕获并打印错误
              }
            },
            child: Text("发起POST请求"),
          ),
        ),
      ),
    );
  }
}

使用FormData上传文件

FormData可以用来上传表单数据或文件。以下是一个上传单个文件的示例:

import 'package:flutter/material.dart';
import 'package:dio/dio.dart';
import 'dart:io';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text("Dio 文件上传")),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              try {
                final dio = Dio(); // 创建 Dio 实例
                final formData = FormData.fromMap({
                  'file': await MultipartFile.fromFile("./example.txt",
                      filename: "example.txt"),
                });

                final response = await dio.post(
                  'https://example.com/upload',
                  data: formData,
                );
                print(response.data); // 打印返回数据
              } catch (e) {
                print('Error: $e'); // 捕获并打印错误
              }
            },
            child: Text("上传文件"),
          ),
        ),
      ),
    );
  }
}

添加拦截器

拦截器可以用于修改请求、响应或处理错误。以下是一个简单的日志拦截器示例:

import 'package:flutter/material.dart';
import 'package:dio/dio.dart';
import 'dart:developer' as developer;

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text("Dio 拦截器示例")),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              final dio = Dio(); // 创建 Dio 实例

              // 添加日志拦截器
              dio.interceptors.add(
                LogInterceptor(
                  request: true,
                  responseBody: true,
                  responseHeader: false,
                  error: true,
                  requestHeader: false,
                ),
              );

              try {
                final response = await dio.get('https://jsonplaceholder.typicode.com/posts/1');
                print(response.data); // 打印返回数据
              } catch (e) {
                developer.log('Error: $e'); // 打印错误日志
              }
            },
            child: Text("测试拦截器"),
          ),
        ),
      ),
    );
  }
}

自定义配置

可以通过设置BaseOptions来统一管理所有请求的默认配置:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text("Dio 配置示例")),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              final options = BaseOptions(
                baseUrl: 'https://jsonplaceholder.typicode.com',
                connectTimeout: Duration(seconds: 5),
                receiveTimeout: Duration(seconds: 3),
              );

              final dio = Dio(options); // 使用自定义配置创建 Dio 实例

              try {
                final response = await dio.get('/posts/1');
                print(response.data); // 打印返回数据
              } catch (e) {
                print('Error: $e'); // 捕获并打印错误
              }
            },
            child: Text("使用自定义配置"),
          ),
        ),
      ),
    );
  }
}

处理错误

当请求失败时,Dio会抛出DioException异常。您可以捕获该异常并处理错误:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text("Dio 错误处理")),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              final dio = Dio();

              try {
                final response = await dio.get('https://jsonplaceholder.typicode.com/invalid-url');
                print(response.data); // 这行代码不会被执行
              } on DioException catch (e) {
                if (e.response != null) {
                  print('Error Code: ${e.response!.statusCode}');
                  print('Error Message: ${e.response!.statusMessage}');
                } else {
                  print('Error Message: ${e.message}');
                }
              }
            },
            child: Text("测试错误处理"),
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


yjy_dio_5_4_0 是一个基于 Dio 的 Flutter 网络请求插件,它封装了 Dio 的常用功能,并提供了更简洁的 API 来进行网络请求。Dio 是一个强大的 Dart HTTP 客户端,支持拦截器、全局配置、FormData、文件上传/下载等功能。

以下是如何使用 yjy_dio_5_4_0 插件进行网络请求的基本步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 yjy_dio_5_4_0 依赖:

dependencies:
  flutter:
    sdk: flutter
  yjy_dio_5_4_0: ^1.0.0  # 请根据实际情况填写版本号

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

2. 导入包

在需要使用网络请求的 Dart 文件中导入 yjy_dio_5_4_0 包:

import 'package:yjy_dio_5_4_0/yjy_dio_5_4_0.dart';

3. 初始化 Dio

在使用 yjy_dio_5_4_0 之前,通常需要先初始化 Dio 实例。你可以通过 YJYDio 类来创建一个 Dio 实例,并进行一些全局配置。

void main() {
  // 初始化 Dio
  YJYDio.init(
    baseUrl: 'https://jsonplaceholder.typicode.com', // 设置基础URL
    connectTimeout: 5000, // 连接超时时间
    receiveTimeout: 3000, // 接收数据超时时间
  );

  runApp(MyApp());
}

4. 发起网络请求

yjy_dio_5_4_0 提供了多种方法来发起网络请求,例如 getpostputdelete 等。

GET 请求

void fetchData() async {
  try {
    var response = await YJYDio().get('/posts/1');
    print(response.data);
  } catch (e) {
    print('Error: $e');
  }
}

POST 请求

void postData() async {
  try {
    var response = await YJYDio().post('/posts', data: {
      'title': 'foo',
      'body': 'bar',
      'userId': 1,
    });
    print(response.data);
  } catch (e) {
    print('Error: $e');
  }
}

PUT 请求

void updateData() async {
  try {
    var response = await YJYDio().put('/posts/1', data: {
      'id': 1,
      'title': 'foo',
      'body': 'bar',
      'userId': 1,
    });
    print(response.data);
  } catch (e) {
    print('Error: $e');
  }
}

DELETE 请求

void deleteData() async {
  try {
    var response = await YJYDio().delete('/posts/1');
    print(response.data);
  } catch (e) {
    print('Error: $e');
  }
}

5. 拦截器

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

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

6. 文件上传

yjy_dio_5_4_0 也支持文件上传功能。

void uploadFile() async {
  var file = File('path/to/file');
  var formData = FormData.fromMap({
    'file': await MultipartFile.fromFile(file.path, filename: 'upload.txt'),
  });

  try {
    var response = await YJYDio().post('/upload', data: formData);
    print(response.data);
  } catch (e) {
    print('Error: $e');
  }
}

7. 文件下载

yjy_dio_5_4_0 也支持文件下载功能。

void downloadFile() async {
  try {
    var response = await YJYDio().download(
      'https://example.com/file.zip',
      'path/to/save/file.zip',
    );
    print('File downloaded to ${response.data}');
  } catch (e) {
    print('Error: $e');
  }
}

8. 取消请求

你可以通过 CancelToken 来取消一个正在进行的请求。

void cancelRequest() async {
  var cancelToken = CancelToken();

  YJYDio().get('/posts/1', cancelToken: cancelToken).catchError((e) {
    if (CancelToken.isCancel(e)) {
      print('Request canceled');
    }
  });

  // 取消请求
  cancelToken.cancel();
}
回到顶部