Flutter Future vs Completer

时间:2019-08-24 15:42:54

标签: flutter dart

FutureCompleter有什么区别?

我都不在寻找任何文档部分,而是希望看到一个显示两者之间真正区别的示例。

2 个答案:

答案 0 :(得分:4)

更喜欢使用Completer

Completer是用于从头开始创建Future的类。因此,除非您真的是从头开始创建Future,否则可能不应该使用Completer

如何创造未来

您可以使用Completer的构造函数来创建Future而不使用Future

final myFuture = Future(() {
  final result = doSomethingThatTakesTime();
  return result;
});

使用Future.then()是获取Future的另一种方法:

Future<bool> fileContainsBear(String path) {
  return File(path).readAsString().then((contents) {
    return contents.contains('bear');
  });
}

任何async / await方法都将返回Future:

Future<bool> fileContainsBear(String path) async {
  var contents = await File(path).readAsString();
  return contents.contains('bear');
}

以上所有方法都推荐使用Completer

// This is harder to read.
Future<bool> fileContainsBear(String path) {
  var completer = Completer<bool>();

  File(path).readAsString().then((contents) {
    completer.complete(contents.contains('bear'));
  });

  return completer.future;
}

如何制作完成者

但是,如果您确实确实需要使用Completer,则完成方式如下:

  1. 创建一个新的Completer
  2. 返回其future
  3. 在完成程序或发生错误时告诉完成程序。

这里是一个例子:

class AsyncOperation {
  Completer _completer = new Completer();

  Future<T> doOperation() {
    _startOperation();
    return _completer.future; // Send future object back to client.
  }

  // Something calls this when the value is ready.
  void _finishOperation(T result) {
    _completer.complete(result);
  }

  // If something goes wrong, call this.
  void _errorHappened(error) {
    _completer.completeError(error);
  }
}

此答案中的代码来自documentationEffective Dart guide

答案 1 :(得分:0)

Completer是用于创建Future的辅助类,而Future是一种类型。

所有异步函数都返回Future,但是使用Completer可以创建也返回Future的同步函数。您也可以将同步功能与then等链接起来。

Completer对象是一种处理过程,它无法重新启动。它完成工作并停止。

Future<MyObject> myMethod() {
  final completer = Completer();
  completer.complete(MyObject());
  return completer.future;
}