'yield'关键字在颤动中起什么作用?

时间:2019-04-20 17:32:21

标签: dart flutter

在{strong> Dart 中,yield关键字实际上是什么?想得到一个解释。

4 个答案:

答案 0 :(得分:6)

yield向周围的async*函数的输出流添加一个值。就像return,但不会终止函数。

请参见https://dart.dev/guides/language/language-tour#generators

Stream asynchronousNaturalsTo(n) async* {
  int k = 0;
  while (k < n) yield k++;
}
  

执行yield语句时,它将对表达式的求值结果添加到流中。它不一定挂起(尽管在当前的实现中会挂起)。

答案 1 :(得分:1)

yield语句只能在生成器的函数中使用。
生成器的功能以自然方式生成数据项(如计算得出的,从外部接收的,预定义的值等)。
当下一个数据项准备就绪时,yield语句将该项目发送到数据序列中,这实际上是函数的生成结果。
数据序列可以是同步的也可以是异步的。
在Dart语言中,同步数据序列表示Iterable的实例。
异步数据序列表示Stream的实例。

P.S。
生成器函数可以无限期地生成数据项,直到函数返回为止。
但是与普通函数不同,结果(数据序列)将在函数调用后立即返回并可以立即使用。
在这种情况下,只有当生成器功能将终止(成功或失败)时,才能到达数据序列的末尾。

答案 2 :(得分:1)

接受的答案的链接已断开,here是关于async* sync* yield* yield的官方链接。

如果您有使用其他语言的经验,则可能会使用这些关键字。这是一些克服关键字的提示

  1. async* sync* yield* yield被称为生成器功能。您可能主要在 Bloc模式中使用它们。

  2. async*也是async,您可以照常使用异步

  3. sync*不能用作sync,您将收到以下错误消息:“修饰符同步必须紧跟星号”

  4. yieldyield*仅可用于生成器功能async* sync*)。

有四种组合。

  1. async* yield将返回Stream<dynamic>
Stream<int> runToMax(int n) async* {
  int i = 0;
  while (i < n) {
    yield i;
    i++;
    await Future.delayed(Duration(seconds: 300));
  }
}
  1. async* yield*将调用一个函数并返回Stream<dynamic>
Stream<int> countDownFrom(int n) async* {
  if (n > 0) {
    yield n;
    yield* countDownFrom(n - 1);
  }
}
  1. sync* yield将返回Iterable<dynamic>
Iterable<int> genIterates(int max) sync* {
  var i = 0;
  while (i < max) {
    yield i;
    i++;
  }
}
  1. sync* yield*将调用一个函数并返回Iterable<dynamic>
Iterable<int> countDownFrom(int n) sync* {
  if (n > 0) {
    yield n;
    yield* countDownFrom(n - 1);
  }
}

如果有任何错误,请发表评论以纠正答案。

答案 3 :(得分:1)

我认为 yield* 的正确答案是委托给另一个生成器而不是调用函数。 yield* 只是委托给另一个生成器,这意味着当前生成器停止,另一个生成器接手工作,直到它停止生产。在那之后停止生成值,主生成器恢复生成自己的值。

感谢@András Szepesházi 鼓励我发布此评论作为答案,希望对您有所帮助。