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&lt;Future&lt;dynamic&gt;&gt; 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上线项目实战——队列任务

flutter 高德地图api使用 app内集成定位 地图搜索功能

微批量加载到 Redshift - 一些实际问题

如何在 Flutter 中完全取消对 TextField 的关注,而无需稍后返回焦点

Telegram bot api:错误代码 429,错误:请求太多:稍后重试

如何更改默认请求完成队列?