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
更多关于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
提供了多种方法来发起网络请求,例如 get
、post
、put
、delete
等。
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();
}