'yield'关键字在flutter中做什么?

问题描述 投票:2回答:3

实际上yield关键字在Dart中起什么作用?想得到解释。

dart flutter
3个回答
7
投票

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

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

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

yield语句执行时,会将其表达式的计算结果添加到流中。它不一定是暂停的(尽管在当前的实现中它确实如此)。


4
投票

接受的答案的链接被打破,here是关于async* sync* yield* yield的官方链接。

如果您对其他语言有一些经验,可能会坚持使用这些关键字。以下是获取关键字的一些提示。

  1. async* sync* yield* yield被称为发电机功能。您可能主要使用Bloc模式。
  2. async*也是一个async,你可以照常使用Asynchronous。
  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);
  }
}

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


1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.