Flutter 队列 API 请求稍后执行
Posted
技术标签:
【中文标题】Flutter 队列 API 请求稍后执行【英文标题】:Flutter queue API requests to execute later 【发布时间】:2021-02-01 08:56:55 【问题描述】:我正在实现一个我应该处理离线模式的应用程序。当我检查互联网连接但它没有连接时,我应该将API
请求添加到一个队列中,以便在互联网连接再次恢复时执行。
我该怎么做?
我尝试将类名和方法名添加到队列中,但无法从类中动态调用方法。
我正在使用Dio 包来处理API
请求。
【问题讨论】:
【参考方案1】:如果您从请求中删除 await
,您可以将它们另存为 Future<dynamic>
,例如
Future<dynamic> response = Dio().get("http://www.google.com");
现在您可以将其保存在List<Future<dynamic>> myList = List()
以及何时需要调用它
await myList[0]
或者
myList[0].then()
【讨论】:
【参考方案2】:我已经以这种方式实现了。我知道现在回答这个问题为时已晚,但它在未来仍然有用。
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存储中,如果您不想持久化数据,则可以将其删除。
【讨论】:
以上是关于Flutter 队列 API 请求稍后执行的主要内容,如果未能解决你的问题,请参考以下文章
flutter 高德地图api使用 app内集成定位 地图搜索功能
如何在 Flutter 中完全取消对 TextField 的关注,而无需稍后返回焦点