Flutter网络请求插件flutter_network的使用
Flutter网络请求插件flutter_network的使用
该插件为您的Flutter应用程序提供了网络功能。它包括了执行各种类型HTTP请求和处理API响应的功能。模块组织在几个文件中:
如何使用
- 在Dart文件中导入网络模块:
import 'package:flutter_network/flutter_network.dart';
- 创建一个
FlutterNetwork
实例以进行HTTP请求:
// 初始化一个FlutterNetwork实例,并设置基础URL和令牌回调函数
FlutterNetwork flutterNetwork = FlutterNetwork(
baseUrl: 'https://api.example.com',
tokenCallBack: () {
return Future.value();
},
);
- 使用
flutterNetwork
实例进行HTTP请求:
// 发送GET请求到指定端点,并包含查询参数
Response<dynamic> response = await flutterNetwork.get(
'/endpoint',
apiType: APIType.protected,
data: {'requestBody': requestBody},
query: {'param': 'value'},
);
功能
-
Flutter Network
- 支持如
GET
、POST
、PUT
、PATCH
和DELETE
等HTTP方法。 - 提供多种可定制选项,如头部信息、超时时间等。
- 支持如
-
错误处理
Failure
类表示服务器返回的不同类型的失败响应。- 具体类如
BadRequest
、Unauthorized
等扩展自Failure
类。
-
缓存
-
使用
dio_cache_interceptor
提供内置缓存功能。 -
CacheOptions
: 若要为HTTP请求启用缓存,在初始化FlutterNetwork
时包含CacheOptions
。例如:final FlutterNetwork flutterNetwork = FlutterNetwork( baseUrl: "https://api.example.com", cacheOptions: CacheOptions( store: MemCacheStore(maxSize: 10485760, maxEntrySize: 1048576), policy: CachePolicy.forceCache, maxStale: const Duration(days: 10), priority: CachePriority.high, ), );
可根据具体需求自定义
CacheOptions
。 -
轻松添加重试功能,通过在初始化
FlutterNetwork
时包含RetryInterceptor
。例如:final FlutterNetwork flutterNetwork = FlutterNetwork( baseUrl: "https://api.example.com", retryInterceptor: RetryInterceptor( dio: dio, // 指定您的Dio实例 logPrint: print, // 指定日志函数(可选) retries: 3, // 重试次数(可选) retryDelays: const [ Duration(seconds: 1), // 第一次重试前等待1秒 Duration(seconds: 2), // 第二次重试前等待2秒 Duration(seconds: 3), // 第三次重试前等待3秒 ], ), );
自定义
RetryInterceptor
参数来定义您的首选重试策略,包括重试次数和重试之间的延迟。
-
-
基于令牌的身份验证
- 通过
tokenCallBack
函数轻松集成身份验证令牌。 FlutterNetwork
实例自动处理受保护API调用的身份验证令牌,无需多次初始化传递。
- 通过
-
依赖管理
- 使用流行的包如
dio
、dio_smart_retry
、dio_cache_interceptor
和pretty_dio_logger
。
- 使用流行的包如
-
可定制性
- 可以轻松定制以满足应用的具体需求。
依赖项
dio
: 5.3.4dio_smart_retry
: 6.0.0dio_cache_interceptor
: 3.5.0pretty_dio_logger
: 1.3.1
可以根据具体需求定制网络模块。祝您网络编程愉快!
示例代码
import 'package:flutter/material.dart';
import 'package:flutter_network/flutter_network.dart';
import 'package:network_example/post_model.dart';
const String baseUrl = 'https://jsonplaceholder.typicode.com';
const String posts = '/posts';
void main() async {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
MyApp({super.key});
/// [FlutterNetwork] 是一个用于处理Flutter应用程序中网络请求的工具类。
///
/// 它通过封装常见的网络功能并允许自定义基础URL,提供了一种方便的方法来进行HTTP请求。
final FlutterNetwork flutterNetwork = FlutterNetwork(
baseUrl: baseUrl,
);
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: '网络包示例',
home: NetworkExample(flutterNetwork: flutterNetwork),
);
}
}
class NetworkExample extends StatelessWidget {
const NetworkExample({
Key? key,
required this.flutterNetwork,
}) : super(key: key);
final FlutterNetwork flutterNetwork;
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('网络包'),
centerTitle: true,
),
body: FutureBuilder<List<PostModel>>(
future: fetchPosts(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const Center(
child: CircularProgressIndicator(),
);
} else if (snapshot.hasError) {
return Center(
child: Text('错误: ${snapshot.error}'),
);
} else if (!snapshot.hasData || snapshot.data!.isEmpty) {
return const Center(
child: Text('无数据可用'),
);
} else {
return ListView.builder(
itemCount: snapshot.data!.length,
itemBuilder: (BuildContext context, int index) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: Card(
child: ListTile(
title: Text(
snapshot.data![index].title,
),
subtitle: Text(
snapshot.data![index].body,
),
),
),
);
},
);
}
},
),
);
}
/// 从指定的API端点获取帖子列表。
///
/// 参数:
/// - [flutterNetwork]: 用于发送HTTP GET请求的[FlutterNetwork]实例。
/// - [endpoint]: 指定特定的API端点。
/// - [apiType]: [APIType]枚举定义要访问的API类型(公共或受保护)。
/// - [query]: 可选参数,用于传递查询参数。
///
/// 返回包含API数据的响应,如果请求失败,则抛出异常。
Future<List<PostModel>> fetchPosts() async {
try {
final response = await flutterNetwork.get(
posts,
apiType: APIType.public,
query: {
'_page': 1,
'_limit': 10,
},
);
List<dynamic> body = response.data;
return body.map((dynamic item) => PostModel.fromJson(item)).toList();
} catch (e, stackTrace) {
debugPrint(e.toString());
debugPrint(stackTrace.toString());
throw Exception('加载帖子失败');
}
}
}
更多关于Flutter网络请求插件flutter_network的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter网络请求插件flutter_network的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
flutter_network
是一个用于简化 Flutter 应用程序中网络请求的插件。虽然 Flutter 官方推荐使用 http
或者 dio
库来处理网络请求,但如果你正在使用或想要尝试 flutter_network
插件,以下是基本的使用指南。
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 flutter_network
插件的依赖:
dependencies:
flutter:
sdk: flutter
flutter_network: ^版本号
请将 ^版本号
替换为最新的版本号。
2. 导入包
在你的 Dart 文件中导入 flutter_network
包:
import 'package:flutter_network/flutter_network.dart';
3. 初始化网络服务
在使用 flutter_network
之前,你需要初始化网络服务:
void main() {
Network().init(baseUrl: "https://jsonplaceholder.typicode.com");
runApp(MyApp());
}
4. 发送 GET 请求
你可以使用 Network()
实例来发送 GET 请求:
Future<void> fetchData() async {
try {
var response = await Network().get('/posts');
print(response.data);
} catch (e) {
print('Error: $e');
}
}
5. 发送 POST 请求
发送 POST 请求也非常简单:
Future<void> postData() async {
try {
var response = await Network().post('/posts', data: {
'title': 'foo',
'body': 'bar',
'userId': 1,
});
print(response.data);
} catch (e) {
print('Error: $e');
}
}
6. 处理响应
Network()
的 get
和 post
方法返回一个 Response
对象,你可以通过 response.data
访问返回的数据。
7. 错误处理
你可以使用 try-catch
块来捕获和处理网络请求中的错误。
8. 设置请求头
你可以在发起请求时设置请求头:
var response = await Network().get('/posts', headers: {
'Authorization': 'Bearer your_token',
});
9. 其他 HTTP 方法
flutter_network
也支持其他 HTTP 方法,如 put
, delete
, patch
等:
var response = await Network().put('/posts/1', data: {
'title': 'Updated Title',
});
var response = await Network().delete('/posts/1');
10. 配置全局设置
你可以在 init
方法中配置全局设置,如超时时间、默认请求头等:
Network().init(
baseUrl: "https://jsonplaceholder.typicode.com",
timeout: Duration(seconds: 10),
headers: {
'Authorization': 'Bearer your_token',
},
);