1

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

我使用了 BaseAPiService 类,所以所有的 api 调用都会通过,

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

使用的示例基础 API 服务类

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;
}
}
4

2 回答 2

1

我找到了解决方案

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

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

导航时关闭连接

void dispose(){
  super.dispose();
  client.close()
}
于 2021-02-03T06:29:53.500 回答
0

如果您深入了解您的代码并且没有任何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();
}

被带到这里

于 2021-12-16T15:16:27.410 回答