首页 > 解决方案 > Dart Completer.complete() 结果永远不会解决

问题描述

我有一个返回未来的函数,该函数取决于要解决的回调结果:

   Future connectSocket(String email, String password, {Function onConnectCallback}) async {
    var completer = new Completer();
    print("Connecting...");
    var query = getQueryString(email, password);
    socketIO = await SocketIOManager().createInstance(SocketOptions(localDomainWindows, query: query));

    socketIO.on("loginError", (data) {
      print("Login err");
      _connected = false;
      connectedCallback();
      completer.complete(false);
    });

    socketIO.onConnect((data) {
      print("***CONNECTED***");
      _connected = true;
      completer.complete(true);
      connectedCallback();
    });
    socketIO.connect();
    return completer.future;
  }

我可以看到***CONNECTED***打印到控制台,并且我的套接字服务器确认连接,但功能 -await解决方案永远不会恢复,它只是挂起。

    socketConnection.connectSocket(_email, _password)
    .then((success) {
     print("SUCCESS") // never gets printed
}

标签: flutterdart

解决方案


对此唯一可能的解释是回调中的某些代码阻止了您的程序继续运行,Completer.complete否则应该始终future完成。
但是,如果它被阻塞,事件循环将永远无法调用您的代码。

由于bool赋值永远不应该阻塞 ( _connected = true;),所以函数中唯一可能会停止程序的部分是connectedCallack();. 如果您删除或修复它,您应该会看到您的未来已完成。


推荐阅读