【问题标题】:Flutter queue API requests to execute laterFlutter 队列 API 请求稍后执行
【发布时间】:2021-02-01 08:56:55
【问题描述】:

我正在实现一个我应该处理离线模式的应用程序。当我检查互联网连接但它没有连接时,我应该将API 请求添加到一个队列中,以便在互联网连接再次恢复时执行。

我该怎么做?

我尝试将类名和方法名添加到队列中,但无法从类中动态调用方法。

我正在使用Dio 包来处理API 请求。

【问题讨论】:

    标签: api flutter queue offline-mode dio


    【解决方案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存储中,如果您不想持久化数据,则可以将其删除。

      【讨论】:

        猜你喜欢
        • 2019-12-16
        • 1970-01-01
        • 2014-02-19
        • 1970-01-01
        • 2011-12-10
        • 1970-01-01
        • 2021-01-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多