在Dart中保存流的上次发射值

在Dart中保存流的上次发射值,dart,stream,flutter,google-cloud-firestore,observable,Dart,Stream,Flutter,Google Cloud Firestore,Observable,我使用firestore和Flitter中的底部导航栏制作了一个应用程序。问题是,当我在选项卡之间切换时,每次都会调用build方法。构建方法从firestore下载数据。因此,当我切换选项卡时,应用程序会闪烁(旋转条会显示很短的时间)。我试图通过将firestore流移动到构造函数来解决这个问题。但是,由于流可以在生成方法之前发出,因此它将永远加载 解决方案可以是保存发出的最后一个值。我试图在Rx中使用shareReplay方法解决这个问题,但它们尚未在RxDart中实现。那么,实现这一点的最

我使用firestore和Flitter中的底部导航栏制作了一个应用程序。问题是,当我在选项卡之间切换时,每次都会调用build方法。构建方法从firestore下载数据。因此,当我切换选项卡时,应用程序会闪烁(旋转条会显示很短的时间)。我试图通过将firestore流移动到构造函数来解决这个问题。但是,由于流可以在生成方法之前发出,因此它将永远加载

解决方案可以是保存发出的最后一个值。我试图在Rx中使用shareReplay方法解决这个问题,但它们尚未在RxDart中实现。那么,实现这一点的最佳实践是什么呢?

您可以在rxdart中了解一下。根据文件

已添加到主题的最新项目将发送给该主题的任何新侦听器


使用rxdart的
shareValue
运算符:

final observable = Observable(yourStream).shareValue();
在内部,此操作符使用
行为子对象
。只要有一个订阅者,它就会订阅流(它只订阅一次),当没有更多订阅者时,它就会取消订阅(并处理主题)


另外,正如您所说,您必须在
initState
或类似的方法(而不是
build
方法!)中创建observable。可观测值应存储在
状态的字段中

我在释放模式下运行颤振应用程序,滞后消失,没有任何修改

在rxDart中将
转换为
行为主体

BehaviorSubject\u subject=BehaviorSubject();
stream.listen((x)=>_subject.add(x));

在当前接受的答案中,RXDart中的
可观察类现在已被弃用。相反,您可以使用
行为主题
,但最好使用
值可连接流
,如下所示:

final newStream=ValueConnectableStream(yourStream).autoConnect()

有关更多信息,请参阅。

谢谢,但如何将dart流转换为行为主体?行为主体实现了ValueObservable,实现了Observable,扩展了流。BehaviorSubject可以做流所能做的一切,再加上更多,所以它应该只是一个直接的替代品。当然,但是firestore插件返回一个dart流,我如何使用它来创建行为主体?@SondreSørbye你知道如何将dart流转换为行为主体吗?这可能意味着你在较慢或不同配置的设备上生产时有竞争条件?