Flutter 流的使用
Posted
技术标签:
【中文标题】Flutter 流的使用【英文标题】:Flutter Streams usage 【发布时间】:2021-10-07 16:05:21 【问题描述】:如何创建流并将其与 StreamBuilder() 一起使用。 我需要像 Firebase Cloud Firestore 那样实时流式传输外部存储目录,如果存储有我搜索的当前文件,我需要获取信息。例如,我有从我的应用程序下载的视频或图像,并且想监听外部存储目录以实时显示文件。当我删除它从屏幕上删除的任何文件时。
【问题讨论】:
【参考方案1】:StreamBuilder
小部件对于这种情况非常有用,您可以查看文档here。
首先,什么是流?把它想象成一个管子,东西在管子的一侧异步传递(意味着不是所有的项目都同时传递);并且,在未来的某个时刻,这些物品再次异步到达管道的另一端。
现在,知道Stream
是什么,我们必须意识到我们不知道我们的请求何时结束,它可能永远不会结束!因此,Flutter 为我们提供了StreamBuilder
小部件。假设您的 Firebase 实例返回一个名为 getListOfItems
的 Stream<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)