Flutter网络请求管理插件pop_network的使用
Flutter网络请求管理插件pop_network的使用
pop_network
是一个基于Dio HTTP客户端的扩展库,旨在简化HTTP请求并帮助开发者高效地使用REST API。它支持使用 http_mock_adapter
库来模拟响应。
安装
在你的 pubspec.yaml
文件中添加 pop_network
包:
dependencies:
pop_network: ^1.1.2
然后运行 pub get
来安装该包。
入门指南
简单使用
要开始使用 pop_network
,创建一个 ApiManager
实例并配置你的基础URL。以下是一个简单的GET请求示例:
import 'package:pop_network/pop_network.dart';
final _apiManager = ApiManager(
baseUrl: 'https://jsonplaceholder.typicode.com',
);
void getTodo() async {
final response = await _apiManager.get('/todos/1');
print(response);
}
模拟响应
你还可以使用 pop_network
来模拟响应,以便进行测试或开发。提供一个 loadMockAsset
函数并使用 MockReplyParams
来配置模拟响应:
final _apiManager = ApiManager(
baseUrl: 'https://jsonplaceholder.typicode.com',
loadMockAsset: rootBundle.loadString, // 默认为Flutter的根目录
);
await _apiManager.get(
'/todos/1',
mockReplyParams: MockReplyParams(
mockPath: 'todo_example',
delay: const Duration(seconds: 1),
status: HttpStatusEnum.ok,
),
);
日志记录
pop_network
提供了内置的日志记录支持。你可以这样配置日志记录:
final _apiManager = ApiManager(
baseUrl: 'https://jsonplaceholder.typicode.com',
interceptors: [
PopNetworkLogInterceptor(
logPrint: (str) => developer.log(str.toString(), name: 'TODO_LOG'),
),
],
);
使用 PopCacheInterceptor
缓存请求
该包包括一个缓存机制,允许你将HTTP响应缓存指定的时间。此功能通过 PopCacheInterceptor
和 ICacheRequestData
类实现。
创建一个 MemoryCacheRequestData
实例,该类使用Map在内存中管理缓存,或者创建你自己的 ICacheRequestData
实现,并用它来创建 PopCacheInterceptor
实例:
final apiManager = ApiManager(
baseUrl: 'https://jsonplaceholder.typicode.com',
interceptors: [
PopCacheInterceptor(MemoryCacheRequestData()),
],
);
在请求中使用缓存
要为特定请求启用缓存,你需要在请求中提供 cacheExpiresIn
参数。该参数指定了响应应缓存的时间。以下是一个使用缓存的GET请求示例:
final response = await apiManager.get(
'/todos',
cacheExpiresIn: Duration(minutes: 15), // 将响应缓存15分钟
);
print(response.data);
问题和贡献
如果你遇到任何问题或希望为这个库做出贡献,请访问 GitHub仓库。
完整示例
以下是一个完整的示例,展示了如何在Flutter应用中使用 pop_network
进行网络请求、模拟响应、日志记录和缓存:
pubspec.yaml
name: pop_network_example
description: A new Flutter project.
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
version: 1.0.0+1
environment:
sdk: ">=2.17.0 <3.0.0"
dependencies:
flutter:
sdk: flutter
pop_network: ^1.1.2
dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: ^2.0.0
flutter:
uses-material-design: true
assets:
- assets/
main.dart
import 'package:flutter/material.dart';
import 'package:pop_network/pop_network.dart';
import 'package:flutter/services.dart' show rootBundle;
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Pop Network Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final _apiManager = ApiManager(
baseUrl: 'https://jsonplaceholder.typicode.com',
interceptors: [
PopNetworkLogInterceptor(
logPrint: (str) => developer.log(str.toString(), name: 'TODO_LOG'),
),
PopCacheInterceptor(MemoryCacheRequestData()),
],
loadMockAsset: rootBundle.loadString, // 默认为Flutter的根目录
);
String _response = '';
void _getTodo() async {
try {
final response = await _apiManager.get(
'/todos/1',
cacheExpiresIn: Duration(minutes: 15), // 将响应缓存15分钟
);
setState(() {
_response = response.data.toString();
});
} catch (e) {
setState(() {
_response = 'Error: $e';
});
}
}
void _getMockedTodo() async {
try {
final response = await _apiManager.get(
'/todos/1',
mockReplyParams: MockReplyParams(
mockPath: 'assets/todo_example.json',
delay: const Duration(seconds: 1),
status: HttpStatusEnum.ok,
),
);
setState(() {
_response = response.data.toString();
});
} catch (e) {
setState(() {
_response = 'Error: $e';
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Pop Network Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(
onPressed: _getTodo,
child: Text('Get Todo (Real)'),
),
ElevatedButton(
onPressed: _getMockedTodo,
child: Text('Get Todo (Mocked)'),
),
SizedBox(height: 20),
Text(_response),
],
),
),
);
}
}
assets/todo_example.json
{
"userId": 1,
"id": 1,
"title": "delectus aut autem",
"completed": false
}
说明
- pubspec.yaml:添加
pop_network
依赖并声明资产文件。 - main.dart:创建一个简单的Flutter应用,使用
pop_network
进行网络请求、模拟响应、日志记录和缓存。 - assets/todo_example.json:模拟响应的数据文件。
通过以上步骤,你可以在Flutter应用中轻松地使用 pop_network
进行网络请求管理。
更多关于Flutter网络请求管理插件pop_network的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html