【问题标题】:Flutter: how can I block on an async call from a synchronous method? [duplicate]Flutter:如何阻止来自同步方法的异步调用? [复制]
【发布时间】:2022-01-11 07:54:13
【问题描述】:

我有一个带有同步方法 bool doLogin(String username, String password) 的 Dart 类。

doLogin() 调用内部方法_queryServer(),而后者又调用http.Response response = await http.post()

“_queryServer()”需要异步,以便使用“await”(或使用“.then()”)。 “doLogin()”必须是异步的。

问:如何构建我的代码,使 doLogin() 在 _queryServer() 得到响应(或失败)之前不返回?

我的代码如下所示:

  ...
  Future<void> _queryServer  (username, password) async {
    final headers = {'Content-Type': 'application/json'};
    Map<String, dynamic> logonRequest = {
      "username": username,
      "password": password
    };
    String jsonPayload = jsonEncode(logonRequest);
    http.Response response = await http.post(
      Uri.parse("https://myserver/login"),
      headers: headers,
      body: jsonPayload,
    );
    if (response.statusCode == 200) {
      _isAuthorized = true;
    }
  }
  ...
  bool login(String username, String password)  {
    _queryServer(username, password);
    // Q: How do I block until _queryServer() completes?
    return _isAuthorized;
  }

【问题讨论】:

  • 没有支持的方法来做到这一点。 login 应该是异步的(以及它的调用者,等等)。
  • 这正是问题所在。我不能使登录异步。更不用说它的调用者了,等等…… 问:也许 Flutter 有一个类可以同步地进行 HTTP “post”?
  • 如果您不能正确地使login 异步(为什么不呢?),那么您需要提供一个单独的 API 供调用者在查询完成时检查(并且可能会收到通知)。

标签: flutter dart async-await


【解决方案1】:

login 方法标记为async 方法:

Future<bool> login(String username, String password) async {
  await _queryServer(username, password);
  return _isAuthorized;
}

【讨论】:

  • 这正是我不能做的。我正在寻找一种方法来调用异步库函数,而不会用异步“污染”整个调用层次结构。
猜你喜欢
  • 2019-05-26
  • 2016-07-20
  • 1970-01-01
  • 2019-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多