如何解决Flutter队列API请求稍后执行
我正在实现一个应处理脱机模式的应用程序。当我检查互联网连接并且未连接时,我应该将API
请求添加到队列中,以便在互联网连接再次恢复时执行。
我该怎么做?
我试图将类名和方法名添加到队列中,但是无法动态地从类中调用方法。
我正在使用Dio包来处理API
请求。
解决方法
如果您从请求中删除了await
,则可以将其另存为Future<dynamic>
作为示例
Future<dynamic> response = Dio().get("http://www.google.com");
现在您可以将其保存在List<Future<dynamic>> myList = List()
中,并在需要时将其保存
await myList[0]
或
myList[0].then()
,
我是这样实现的。我知道现在回答这个问题为时已晚,但将来仍然有用。
FailedOrderQueue.dart
import 'dart:convert';
import 'package:get_storage/get_storage.dart';
import 'package:select_driver_app/Models/Order.dart';
class FailedOrdersQueue {
GetStorage box = new GetStorage();
List items = [];
bool get hasItems {
return items.isNotEmpty;
}
bool get isEmpty {
return items.length == 0;
}
FailedOrdersQueue() {
// removeAll();
items = _loadQueue();
}
List _loadQueue() {
return box.read('queue') ?? [];
}
bool exists(int orderId) {
if (items.isEmpty) {
return false;
}
try {
dynamic object = items.firstWhere(
(element) => element['order_id'] == orderId,);
return object == null ? false : true;
} catch (e) {
return false;
}
}
removeAll() {
items = [];
_commit();
}
add(Order order,int currentTripId) {
if (!exists(order.id)) {
items.add({
'order_id': order.id,'trip_id': currentTripId,'credit_note': jsonEncode(order.creditNoteList),'delivery_img_path': order.image,'sign_img_path': order.signature
});
_commit();
}
}
_commit() {
box.write('queue',items);
}
remove(Order order) {
items.removeWhere(
(element) => element['order_id'] == order.id,);
_commit();
}
removeById(int id) {
items.removeWhere(
(element) => element['order_id'] == id,);
_commit();
}
}
main.dart 或在控制器中(Getx)
FailedOrdersQueue failedOrderQueue = new FailedOrdersQueue();
failedOrderQueue.add(order,currentTripId!);
failedOrderQueue.remove(order);
failedOrderQueue.items.forEach((rawOrderInfo) {
//process the queue
});
这种方式将数据保存在Get storage中,如果不想持久化数据,可以删除。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。