如何在快速浏览页面的同时处理 HTTP api 请求 |飘动 |镖

How to handle HTTP api request while navigating pages quickly | FLUTTER | DART

对于我的场景,我使用了 flutter http 包来发出 http 请求...在主屏幕中我必须发送大约 3 个 http 请求,因为我不得不使用 await 请求一个接一个地发送。

我使用了 BaseAPIService class 所以所有 api 调用都会通过它,

如果我在发生上述请求时导航到另一个地方,如何破坏该连接??否则,如果在导航之后应用程序也在等待之前的 Api 请求完成..

样本库api 使用的服务class

class ApiService {
  apiGet(url, data) async {
  Get.dialog(LoadingDialog());
  var response;
  if (data == null) {
    response = await http.get(
    baseUrl + url,
    headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json',
    },
  );
}
Navigator.pop(Get.overlayContext);
return response;
}

apiPost(url, data) async {
  FocusScopeNode currentFocus = FocusScope.of(Get.context);
  if (!currentFocus.hasPrimaryFocus) {
  currentFocus.unfocus();
  }
  Get.dialog(LoadingDialog());
  var response;
  if (data != null) {
   response = await http.post(baseUrl + url,
      headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json',
      },
      body: data);
}
if (data == null) {
  response = await http.post(
    baseUrl + url,
    headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json',
    },
  );
}
Navigator.pop(Get.overlayContext);
return response;
}
}

我找到了解决方案

要实现这一点,需要在导航时关闭 http 连接,因为这样做需要从 http 创建一个客户端,并且不需要在 dispose 方法上关闭该客户端

var client = http.Client()
var response = await client.get(url)

导航时关闭连接

void dispose(){
  super.dispose();
  client.close()
}

如果您深入研究代码并且没有 http.Client 的任何处理程序。而且您不希望 UI 上显示最新的响应。那么你可以按照这个方法。

我们无法取消 Dart 中的未来,但我们确实可以停止收听流。如果您想取消 Future,我们可以将 Future 转换为流并停止监听它。

void main() {
    // keep a reference to your stream subscription
    StreamSubscription<List> dataSub;

    // convert the Future returned by getData() into a Stream
    dataSub = getData().asStream().listen((List data) {
    updateDisplay(data);
  });

  // user navigated away!
  dataSub.cancel();
}

已参加 here