快速导航页面时如何处理HTTP api请求 |颤振 |镖

Posted

技术标签:

【中文标题】快速导航页面时如何处理HTTP api请求 |颤振 |镖【英文标题】:How to handle HTTP api request while navigating pages quickly | FLUTTER | DART 【发布时间】:2021-05-05 11:21:59 【问题描述】:

对于我的场景,我使用了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;


【问题讨论】:

你能提供一些代码吗?很难说如何帮助你。 添加了示例基础 api 服务类 您能否再具体一点您想要实现的目标?您想在使用导航器切换屏幕后终止已建立的连接? 是的,如果我从主页导航而不等待http响应,仍然代码正在等待主页响应完成,然后再发送新的http响应,我认为这是因为等待功能,我需要导航时终止与 http 的连接 client.close() 完成了工作 【参考方案1】:

我找到了解决办法

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

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

导航时关闭连接

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

【讨论】:

这是一个很好的解决方案!不需要特殊的 API...【参考方案2】:

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

【讨论】:

以上是关于快速导航页面时如何处理HTTP api请求 |颤振 |镖的主要内容,如果未能解决你的问题,请参考以下文章

使用 Azure 文本翻译 API 时如何处理限制?

当我推送到 GitHub 时如何处理秘密 API 密钥,以便在克隆存储库时我的项目仍然有效?

调用 REST API 时如何处理 Google Ads API 速率限制?

离开页面时如何处理jQuery ajax发布错误

离开页面时如何处理jQuery ajax发布错误

JWT:当用户打开新标签时如何处理 GET 请求?