确保在后台处理颤振应用程序中的REST调用

确保在后台处理颤振应用程序中的REST调用,rest,flutter,background-process,Rest,Flutter,Background Process,我需要确保某个HTTP请求已成功发送。因此,我想知道是否有一种简单的方法可以将这样的请求移动到后台服务任务中 我的问题背景如下: 我们正在开发一个使用颤振的测量应用程序。不幸的是,该应用程序旨在用于无法保证移动互联网连接的环境中。因此,我不能简单地发布一次调查结果,但如果由于网络问题而失败,我必须重试。我当前的代码如下所示。我目前的解决方案的问题是,它只在应用程序始终处于活动状态时才起作用。如果用户最小化或关闭应用程序,我想要上传的数据就会丢失。 因此,我正在寻找一种解决方案,将上传过程包装在后

我需要确保某个HTTP请求已成功发送。因此,我想知道是否有一种简单的方法可以将这样的请求移动到后台服务任务中

我的问题背景如下: 我们正在开发一个使用颤振的测量应用程序。不幸的是,该应用程序旨在用于无法保证移动互联网连接的环境中。因此,我不能简单地发布一次调查结果,但如果由于网络问题而失败,我必须重试。我当前的代码如下所示。我目前的解决方案的问题是,它只在应用程序始终处于活动状态时才起作用。如果用户最小化或关闭应用程序,我想要上传的数据就会丢失。 因此,我正在寻找一种解决方案,将上传过程包装在后台服务任务中,以便即使用户关闭应用程序,也能对其进行处理。我发现了一些帖子和插件(即和),但它们对我的特定用例没有帮助。第一种方法描述了当某个事件(即地理围栏发生)发生时如何通知应用程序,第二种方法仅每15分钟工作一次,并关注不同的场景。 有人知道一个简单的方法吗?我如何确保即使在互联网连接不好(或者目前没有)的情况下也能处理请求,同时允许用户最小化甚至关闭应用程序

Future _processUploadQueue() async {
  int retryCounter = 0;
  Future.doWhile(() {
    if(retryCounter == 10){
      print('Abborted after 10 tries');
      return false;
    }
    if (_request.uploaded) {
      print('Upload ready');
      return false;
    }
    if(! _request.uploaded) {
      _networkService.sendRequest(request: _request.entry)
          .then((id){
            print(id);
            setState(() {
              _request.uploaded = true;
            });
      }).catchError((e) {
        retryCounter++;
        print(e);
      });
    }
    // e ^ retryCounter, min 0 Sec, max 10 minutes
    int waitTime = min(max(0, exp(retryCounter)).round(), 600);
    print('Waiting $waitTime seconds till next try');
    return new Future.delayed(new Duration(seconds: waitTime), () {
      print('waited $waitTime seconds');
      return true;
    });
  })
  .then(print)
  .catchError(print);
}
您可以使用插件将每个HTTP响应保存到设备,直到上载成功完成。像这样:

requests: [
  {
    id: 8eh1gc,
    request: "..."
  },
  ...
],


然后,每当启动应用程序时,检查列表中是否有任何请求,重试它们,并在完成后删除它们。您也可以使用
后台\u fetch
每15分钟执行一次。

我已经像您一样成功了,但我仍然认为这有点难看,有一个优雅的解决方案会很酷。尽管如此,还是谢谢你。你找到办法了吗?这太疯狂了,我找不到任何示例,就像没有人处理某些连接问题一样……不幸的是,我没有找到一个优雅的解决方案并像上面的示例那样实现它