为什么 flutter 中的 LicenseRegistry 返回 Stream<LicenseEntry> 而不是 List<LicenseEntry>?

LOL*_*dad 1 licensing flutter flutter-dependencies

我想了解为什么LicenseRegistry.licenses返回Stream<LicenseEntry>而不返回List<LicenseEntry>?在这里,一个简单的列表代替 Stream 不是更有意义吗?

dart 文档将 Stream 描述如下:

Stream 提供了一种接收事件序列的方法。每个事件要么是数据事件(也称为流的元素),要么是错误事件(这是某件事情失败的通知)。当流发出其所有事件时,单个“完成”事件将通知侦听器已到达末尾。

也许有人可以解释许可证列表和流描述之间的关系吗?

flutter 文档指出这LicenseRegistry.licenses是一项昂贵的操作。它返回一个 Stream 的事实与此相关吗?

资料来源:

https://api.dart.dev/stable/2.8.2/dart-async/Stream-class.html https://api.flutter.dev/flutter/foundation/LicenseRegistry/licenses.html

Ric*_*eap 5

当部分结果对消费者有用时,流就很有用(如下所示)。在这种情况下,普通消费者就是LicensePage小部件。它使用监听流await for,并在获取每个包的许可证时将它们添加到带有setState. 通过这种方式,随着工作继续提供更多许可证,它可以开始呈现最终页面。(await for如果小部件在仍在进行中时被卸载,则循环将终止,因此如果许可证页面关闭,则页面的其余部分不会被格式化和呈现。)

相反,如果返回值是一个列表,则必须在呈现第一个许可证之前构建该列表。

一个有趣的变化是,LicensePage小部件必须从LicenseEntry可迭代传递的每个段落中提取段落。它将它们转换为后台任务中的列表!因此,它处理组中特定条目中的每组段落。

  final List<LicenseParagraph> paragraphs =
    await SchedulerBinding.instance.scheduleTask<List<LicenseParagraph>>(
      license.paragraphs.toList,
      Priority.animation,
      debugLabel: 'License',
    );
Run Code Online (Sandbox Code Playgroud)