在Dart中保存流的最后发出的值

时间:2018-12-20 14:23:16

标签: dart stream flutter google-cloud-firestore observable

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

一个解决方案可能是保存最后发出的值。我尝试使用Rx中的shareReplay方法来解决此问题,但尚未在RxDart中实现。那么,实现此目标的最佳实践是什么?

5 个答案:

答案 0 :(得分:1)

您可以在rxdart中查看BehaviorSubject。根据文档

  

已添加到主题的最新项目将发送给该​​主题的所有新听众。

答案 1 :(得分:1)

使用rxdart的shareValue运算符:

final observable = Observable(yourStream).shareValue();

在内部,此运算符使用BehaviorSubject。只要有一个订阅者(它将只订阅一次),它将立即订阅流;如果没有订阅者,它将取消订阅(并处置主题)。

此外,正如您所说,您必须使用initState或类似方法(不是build方法)来创建可观察对象。可观察对象应存储在State的字段中。

答案 2 :(得分:0)

我在发布模式下运行了flutter应用程序,并且滞后消失了,没有进行任何修改。

答案 3 :(得分:0)

在rxDart中将stream转换为BehaviorSubject

BehaviorSubject<Data> _subject = BehaviorSubject<Data>();

stream.listen((x) => _subject.add(x));

答案 4 :(得分:0)

在当前接受的答案中,不推荐使用RXDart中的Observable类。相反,您可以使用BehaviorSubject,但最好使用ValueConnectableStream,如下所示:

final newStream = ValueConnectableStream(yourStream).autoConnect()

有关更多信息,请参见RXDart docs