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

Son*_*bye 3 stream observable dart flutter google-cloud-firestore

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

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

bof*_*mer 7

使用shareValuerxdart的运算符:

final observable = Observable(yourStream).shareValue();
Run Code Online (Sandbox Code Playgroud)

在内部,此运算符使用BehaviorSubject. 只要有一个订阅者,它就会订阅流(它只会订阅一次),并在没有更多订阅者时取消订阅(并处理主题)。

另外,正如您所说,您必须在initState或类似的方法中创建可观察对象(不是build方法!)。可观察对象应存储在State.


Pal*_*nyi 7

在当前接受的答案中,ObservableRXDart 中的类现已被弃用。相反,您可以使用 aBehaviorSubject但最好使用 aValueConnectableStream代替,如下所示:

final newStream = ValueConnectableStream(yourStream).autoConnect()
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅RXDart 文档。