Flutter 流的使用

Posted

技术标签:

【中文标题】Flutter 流的使用【英文标题】:Flutter Streams usage 【发布时间】:2021-10-07 16:05:21 【问题描述】:

如何创建流并将其与 StreamBuilder() 一起使用。 我需要像 Firebase Cloud Firestore 那样实时流式传输外部存储目录,如果存储有我搜索的当前文件,我需要获取信息。例如,我有从我的应用程序下载的视频或图像,并且想监听外部存储目录以实时显示文件。当我删除它从屏幕上删除的任何文件时。

【问题讨论】:

【参考方案1】:

StreamBuilder 小部件对于这种情况非常有用,您可以查看文档here。

首先,什么是流?把它想象成一个管子,东西在管子的一侧异步传递(意味着不是所有的项目都同时传递);并且,在未来的某个时刻,这些物品再次异步到达管道的另一端。

现在,知道Stream 是什么,我们必须意识到我们不知道我们的请求何时结束,它可能永远不会结束!因此,Flutter 为我们提供了StreamBuilder 小部件。假设您的 Firebase 实例返回一个名为 getListOfItemsStream<List<Item>>。使用StreamBuilder,您可以:

//... As a child of any of your widgets
StreamBuilder(
  stream: instance.getListOfItems(), // <-- We simply pass the function that returns the stream, Flutter will manage the rest!
  builder: (ctx, snapshot) 
    // The snapshot contains the data that is being recieved if any
    // you can check the docs:
    // https://api.flutter.dev/flutter/widgets/AsyncSnapshot-class.html
    // And for the ConnectionState enum
    // https://api.flutter.dev/flutter/widgets/ConnectionState-class.html
    if (snapshot.connectionState == ConnectionState.waiting) 
      // What should be rendered when loading or waiting for a response?
      return Loading();
     

    if (snapshot.hasData) 
      // What should be rendered when there's data?
      // Remember, data may keep arriving
      return MyList(snapshot.data);
    

    if (snapshot.hasError) 
      // Wow, the stream failed, what should be rendered when there's an error?
      return Error();
    
  
)

这应该适用于StreamBuilder 的任何基本实现。从这里您可以构建动态列表、分页等等!

【讨论】:

感谢您的回答。但是我没有问Firebase,当我保留一些文件时,我需要创建外部存储目录流。 那是独立的。您可以将该示例用于您的外部存储目录。你只需要它返回一个Stream 的东西。 如果数据发生变化,是否需要将 setState 放入 Stream 以更新状态? 您需要将项目列表作为您的状态的一部分吗? 我需要显示当前信息,如果文件被删除,我的屏幕上的列表应该更新,如果新文件添加,我的屏幕上的列表应该再次更新等等,就像 Firestore 实时变化一样。

以上是关于Flutter 流的使用的主要内容,如果未能解决你的问题,请参考以下文章

如何在邮件被验证时更新Firebase用户流的数据(Flutter)

如何在邮件被验证时更新Firebase用户流的数据(Flutter)

Flutter 中 StreamBuilder 和流的问题(接收重复数据)

Flutter最酷炫瀑布流实现

Flutter最酷炫瀑布流实现

找不到正确的Provider在带有导航流的Flutter中,此Y小部件上方