Flutter网络请求插件playx_network的使用
Flutter网络请求插件playx_network的使用
Playx Network 插件介绍
Playx Network 是一个包装在 Dio 之上的插件,用于执行 API 请求。它提供了更好的错误处理,并且可以轻松获取任何 API 请求的结果。
- 支持 GET, POST, PUT 和 DELETE HTTP 方法。
- 提供了更好的错误处理机制,可以根据需要自定义这些错误。
- 每个请求都由
NetworkResult
返回,表示 API 请求的成功或失败。 - 不再需要使用 try-catch,因为每个请求都会被处理。
- 网络调用以清晰、易于阅读的格式进行日志记录。
安装 Playx Network
在 pubspec.yaml
中添加以下依赖项:
playx_network: ^0.2.0
使用 Playx Network
我们可以使用 PlayxNetworkClient
来执行 GET, POST, PUT 和 DELETE HTTP 方法。
-
设置 PlayxNetworkClient 并根据需求配置它
- 根据您的需求创建一个
PlayxNetworkClient
实例。 通常情况下,您只需要创建一个实例来满足整个应用的需求。
final PlayxNetworkClient _client = PlayxNetworkClient( dio: Dio( BaseOptions( baseUrl: 'https://api.example.com', // 替换为实际的基 URL connectTimeout: const Duration(seconds: 20), sendTimeout: const Duration(seconds: 20), ), ), customHeaders: () async { return {'authorization': 'Bearer token'}; // 添加自定义头部 }, errorMapper: (json) { if (json.containsKey('message')) { return json['message'] as String?; } return null; }, );
- 根据您的需求创建一个
-
使用客户端执行任何 GET, POST, PUT 和 DELETE HTTP 方法
例如,我们将执行一个 GET 请求来获取猫的列表,使用此 API:
https://api.thecatapi.com/v1/images/search?limit=10
- 首先创建一个模型类来处理从 API 返回的数据。该类应包含一个从 JSON 函数,该函数将动态 JSON 转换为模型。
class Cat { String? id; String? url; num? width; num? height; Cat({ this.id, this.url, this.width, this.height, }); Cat.fromJson(dynamic json) { id = json['id']; url = json['url']; width = json['width']; height = json['height']; } Map<String, dynamic> toJson() { final map = <String, dynamic>{}; map['id'] = id; map['url'] = url; map['width'] = width; map['height'] = height; return map; } }
- 执行 GET 请求:
final result = await _client.getList( 'https://api.thecatapi.com/v1/images/search?limit=10', query: {}, fromJson: Cat.fromJson, );
- 处理请求结果:
result.when(success: (cats) { // 处理成功情况,这里返回猫的列表。 }, error: (error) { // 处理错误情况并显示错误消息。 print("Error is : ${error.message}"); });
可用的方法
以下是 PlayxNetworkClient
的提供的所有方法:
Method | Description |
---|---|
get | 发送 GET 请求到给定的 URL 并返回 Type [T] 模型的 NetworkResult |
getList | 发送 GET 请求到给定的 URL 并返回 List of Type [T] 模型的 NetworkResult |
post | 发送 POST 请求到给定的 URL 并返回 Type [T] 模型的 NetworkResult |
postList | 发送 POST 请求到给定的 URL 并返回 List of Type [T] 模型的 NetworkResult |
put | 发送 PUT 请求到给定的 URL 并返回 Type [T] 模型的 NetworkResult |
putList | 发送 PUT 请求到给定的 URL 并返回 List of Type [T] 模型的 NetworkResult |
delete | 发送 DELETE 请求到给定的 URL 并返回 Type [T] 模型的 NetworkResult |
deleteList | 发送 DELETE 请求到给定的 URL 并返回 List of Type [T] 模型的 NetworkResult |
错误消息定制
您可以自定义错误消息,使用自己的消息。
-
创建一个继承自
ExceptionMessage
的类,并覆盖所有消息,如下所示:class CustomExceptionMessage extends ExceptionMessage { const CustomExceptionMessage(); @override String get badRequest => "Sorry, The API request is invalid or improperly formed."; @override String get conflict => "Sorry, The request wasn't completed due to a conflict."; @override String get defaultError => "Sorry, Something went wrong."; @override String get emptyResponse => "Sorry, Couldn't receive response from the server."; @override String get formatException => "Sorry, The request wasn't formatted correctly."; @override String get internalServerError => "Sorry, There is an internal server error"; @override String get noInternetConnection => "Sorry, There is no internet connection."; @override String get notAcceptable => "Sorry, The request is not acceptable"; @override String get notFound => "Sorry, The resource requested couldn't be found."; @override String get requestCancelled => "Sorry, The request has been canceled"; @override String get requestTimeout => "Sorry, The request has timed out."; @override String get sendTimeout => "Sorry, The request has send timeout in connection with API server"; @override String get serviceUnavailable => "Sorry, The service is unavailable"; @override String get unableToProcess => "Sorry, Couldn't process the data."; @override String get unauthorizedRequest => "Sorry, The request is unauthorized."; @override String get unexpectedError => "Sorry, Something went wrong."; }
-
配置
PlayxNetworkClient
使用您创建的CustomExceptionMessage
。final PlayxNetworkClient _client = PlayxNetworkClient( exceptionMessages: const CustomExceptionMessage(), );
映射网络结果
获取 API 结果后,我们可以很容易地将其映射到我们想要的任何类型。
-
示例:将猫的列表映射到图片 URL 列表。
final NetworkResult<List<String?>> catImagesResult = result.map( success: (success) { final data = success.data; final imagesUrls = data.map((e) => e.url).toList(); return NetworkResult.success(imageUrls); }, error: (error) { return NetworkResult<List<String?>>.error(error.error); }, );
-
同样,也可以异步映射结果:
final NetworkResult<List<String?>> catImagesAsyncResult = await result.mapAsync( success: (success) async { final data = success.data; final imageUrls = data.map((e) => e.url).toList(); return NetworkResult.success(imageUrls); }, error: (error) async { return NetworkResult<List<String?>>.error(error.error); }, );
日志记录
该包使用 pretty_dio_logger
包来记录 Dio 请求。
如何查看
VS Code:
Android Studio:
您可以自定义打印的内容或是否启用日志记录,如下所示:
final PlayxNetworkClient _client = PlayxNetworkClient(
attachLoggerOnDebug: true,
logSettings: const LoggerSettings(
responseBody: true,
request: true,
requestHeader: true,
requestBody: true,
responseHeader: false,
error: true,
maxWidth: 90,
compact: true,
),
);
更多关于Flutter网络请求插件playx_network的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter网络请求插件playx_network的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何使用 playx_network
插件在 Flutter 中进行网络请求的示例代码。这个插件可以帮助你简化网络请求的处理。
首先,确保你已经在 pubspec.yaml
文件中添加了 playx_network
依赖:
dependencies:
flutter:
sdk: flutter
playx_network: ^最新版本号 # 请替换为实际最新版本号
然后运行 flutter pub get
来获取依赖。
接下来,你可以按照以下步骤使用 playx_network
进行网络请求:
-
配置 PlayxNetwork:
在你的应用入口文件(通常是
main.dart
)中配置PlayxNetwork
。
import 'package:flutter/material.dart';
import 'package:playx_network/playx_network.dart';
void main() {
// 配置 PlayxNetwork
PlayxNetwork.instance.configure(
baseUrl: 'https://api.example.com', // 你的API基础URL
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
// 可以添加更多的全局header
},
);
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: HomeScreen(),
);
}
}
-
创建一个数据模型:
假设你的API返回的数据是一个用户对象,你可以创建一个数据模型来解析这个JSON。
import 'package:json_annotation/json_annotation.dart';
part 'user_model.g.dart';
@JsonSerializable()
class UserModel {
final String name;
final int age;
UserModel({required this.name, required this.age});
factory UserModel.fromJson(Map<String, dynamic> json) => _$UserModelFromJson(json);
Map<String, dynamic> toJson() => _$UserModelToJson(this);
}
生成 user_model.g.dart
文件:
flutter pub run build_runner build
-
进行网络请求:
在你的界面组件中进行网络请求。
import 'package:flutter/material.dart';
import 'package:playx_network/playx_network.dart';
import 'user_model.dart';
class HomeScreen extends StatefulWidget {
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
UserModel? user;
String errorMessage = '';
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('PlayxNetwork Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
if (errorMessage.isNotEmpty)
Text(
errorMessage,
style: TextStyle(color: Colors.red),
),
if (user != null)
Column(
children: [
Text('Name: ${user!.name}'),
Text('Age: ${user!.age}'),
],
),
ElevatedButton(
onPressed: fetchUserData,
child: Text('Fetch User Data'),
),
],
),
),
);
}
void fetchUserData() async {
setState(() {
errorMessage = '';
user = null;
});
try {
final response = await PlayxNetwork.instance.get<Map<String, dynamic>>(
'endpoint/to/fetch/user', // 替换为你的API端点
);
if (response.success) {
final userJson = response.data!;
final userModel = UserModel.fromJson(userJson);
setState(() {
user = userModel;
});
} else {
setState(() {
errorMessage = response.message ?? 'Failed to fetch data';
});
}
} catch (e) {
setState(() {
errorMessage = e.toString();
});
}
}
}
在这个示例中,我们配置了 PlayxNetwork
,创建了一个数据模型 UserModel
,并在 HomeScreen
中进行了一个简单的 GET 请求。如果请求成功,我们将解析 JSON 数据并更新界面;如果请求失败,我们将显示错误信息。
你可以根据需要扩展这个示例,例如添加 POST 请求、处理更多复杂的数据结构、或者添加错误重试逻辑等。