【发布时间】:2021-02-01 08:56:55
【问题描述】:
我正在实现一个我应该处理离线模式的应用程序。当我检查互联网连接但它没有连接时,我应该将API 请求添加到一个队列中,以便在互联网连接再次恢复时执行。
我该怎么做?
我尝试将类名和方法名添加到队列中,但无法从类中动态调用方法。
我正在使用Dio 包来处理API 请求。
【问题讨论】:
标签: api flutter queue offline-mode dio
我正在实现一个我应该处理离线模式的应用程序。当我检查互联网连接但它没有连接时,我应该将API 请求添加到一个队列中,以便在互联网连接再次恢复时执行。
我该怎么做?
我尝试将类名和方法名添加到队列中,但无法从类中动态调用方法。
我正在使用Dio 包来处理API 请求。
【问题讨论】:
标签: api flutter queue offline-mode dio
如果您从请求中删除 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存储中,如果您不想持久化数据,则可以将其删除。
【讨论】: