Flutter网络通用处理插件generic_network的使用
Flutter网络通用处理插件generic_network的使用
特性
这是一个功能强大的Flutter HTTP网络包,旨在以最少的干净代码处理HTTP请求,并轻松处理错误。
开始使用
1. 创建API类
首先,我们需要创建一个继承自BaseApi
的类。这个类用于定义基础URL。
class Api extends BaseApi {
Api() : super(url: "https://your-base-url.com"); // 替换为你的实际基础URL
}
2. 定义请求目标
接下来,我们定义一个继承自TargetType
的类,表示具体的HTTP请求。
class LoginRequest extends TargetType {
final String email;
final String password;
LoginRequest({required this.password, required this.email}) {
requestParameters = {"password": password, "email": email}; // 请求参数
}
[@override](/user/override)
String? get path => "login"; // 替换为你的具体接口路径
[@override](/user/override)
HttpMethod? get method => HttpMethod.post; // HTTP方法,例如POST
[@override](/user/override)
Map<String, dynamic>? get headers => {}; // 额外的请求头
[@override](/user/override)
var requestParameters; // 请求参数
}
3. 定义响应模型
然后,我们定义一个继承自Decodable
的类,表示服务器返回的JSON数据如何解析为对象。
class LoginResponse extends Decodable<LoginResponse> {
String? userName;
int? age;
[@override](/user/override)
LoginResponse fromJson(Map<String, dynamic> json) {
return LoginResponse.fromJson(
age: json["age"],
userName: json["userName"],
);
}
LoginResponse();
LoginResponse.fromJson({required this.age, required this.userName});
}
4. 调用网络请求
最后,我们可以调用网络请求并处理结果。
void login() {
Api().fetchData<LoginResponse, LoginResponse>(
LoginRequest(email: "test@example.com", password: "password"),
LoginResponse(),
).then((value) {
// 处理成功或失败的结果
if (value case Success(value: final value)) {
print("登录成功: $value");
} else if (value case Failure(exception: final exception)) {
print("登录失败: $exception");
}
});
}
示例完整代码
以下是完整的示例代码,包括所有步骤:
import 'package:generic_network/generic_network.dart';
class Api extends BaseApi {
Api() : super(url: "https://your-base-url.com"); // 替换为你的实际基础URL
}
class LoginRequest extends TargetType {
final String email;
final String password;
LoginRequest({required this.password, required this.email}) {
requestParameters = {"password": password, "email": email}; // 请求参数
}
[@override](/user/override)
String? get path => "login"; // 替换为你的具体接口路径
[@override](/user/override)
HttpMethod? get method => HttpMethod.post; // HTTP方法,例如POST
[@override](/user/override)
Map<String, dynamic>? get headers => {}; // 额外的请求头
[@override](/user/override)
var requestParameters; // 请求参数
}
class LoginResponse extends Decodable<LoginResponse> {
String? userName;
int? age;
[@override](/user/override)
LoginResponse fromJson(Map<String, dynamic> json) {
return LoginResponse.fromJson(
age: json["age"],
userName: json["userName"],
);
}
LoginResponse();
LoginResponse.fromJson({required this.age, required this.userName});
}
void login() {
Api().fetchData<LoginResponse, LoginResponse>(
LoginRequest(email: "test@example.com", password: "password"),
LoginResponse(),
).then((value) {
// 处理成功或失败的结果
if (value case Success(value: final value)) {
print("登录成功: $value");
} else if (value case Failure(exception: final exception)) {
print("登录失败: $exception");
}
});
}
更多关于Flutter网络通用处理插件generic_network的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter网络通用处理插件generic_network的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
generic_network
是一个用于 Flutter 的网络请求处理插件,旨在简化网络请求的处理流程,提供统一的错误处理、请求拦截、响应解析等功能。它可以帮助开发者更高效地管理网络请求,减少重复代码。
以下是如何使用 generic_network
插件的基本步骤:
1. 添加依赖
首先,在 pubspec.yaml
文件中添加 generic_network
插件的依赖:
dependencies:
flutter:
sdk: flutter
generic_network: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来安装依赖。
2. 初始化网络客户端
在你的应用程序中,初始化 GenericNetwork
客户端。通常,你可以在 main.dart
或某个单独的配置文件中进行初始化。
import 'package:generic_network/generic_network.dart';
void main() {
// 初始化网络客户端
GenericNetwork.initialize(
baseUrl: 'https://jsonplaceholder.typicode.com', // 基础URL
interceptors: [
LoggingInterceptor(), // 日志拦截器
AuthInterceptor(), // 认证拦截器
],
errorHandler: (error) {
// 全局错误处理
print('Network Error: $error');
},
);
runApp(MyApp());
}
3. 发起网络请求
你可以使用 GenericNetwork
提供的 get
、post
、put
、delete
等方法来发起网络请求。
import 'package:flutter/material.dart';
import 'package:generic_network/generic_network.dart';
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Generic Network Example'),
),
body: Center(
child: FutureBuilder<Map<String, dynamic>>(
future: fetchData(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return CircularProgressIndicator();
} else if (snapshot.hasError) {
return Text('Error: ${snapshot.error}');
} else {
return Text('Response: ${snapshot.data}');
}
},
),
),
),
);
}
Future<Map<String, dynamic>> fetchData() async {
final response = await GenericNetwork.get('/posts/1');
return response.data;
}
}
4. 使用拦截器
generic_network
支持拦截器,你可以在请求发送前或响应返回后进行一些处理。例如,你可以添加一个日志拦截器来记录所有请求和响应。
class LoggingInterceptor extends Interceptor {
@override
void onRequest(RequestOptions options) {
print('Request: ${options.method} ${options.path}');
super.onRequest(options);
}
@override
void onResponse(Response response) {
print('Response: ${response.statusCode} ${response.data}');
super.onResponse(response);
}
@override
void onError(GenericNetworkError error) {
print('Error: ${error.message}');
super.onError(error);
}
}
5. 全局错误处理
你可以在初始化时设置全局错误处理函数,以便在发生网络错误时进行统一处理。
GenericNetwork.initialize(
baseUrl: 'https://jsonplaceholder.typicode.com',
errorHandler: (error) {
print('Global Error: $error');
// 你可以在这里进行错误处理,例如显示一个错误提示
},
);
6. 处理响应数据
generic_network
返回的响应数据是一个 Response
对象,你可以通过 response.data
获取解析后的数据。
final response = await GenericNetwork.get('/posts/1');
final post = response.data; // 假设返回的是一个 Map<String, dynamic>
7. 其他功能
generic_network
还支持:
- 请求头设置:你可以在请求中添加自定义的请求头。
- 请求超时设置:可以设置请求的超时时间。
- 请求取消:支持取消正在进行的请求。
final response = await GenericNetwork.get(
'/posts/1',
headers: {'Authorization': 'Bearer token'},
timeout: Duration(seconds: 10),
);