我使用Firestore和Flutter中的底部导航栏制作了一个应用程序。问题是,当我在选项卡之间切换时,每次都会调用build方法。构建方法从Firestore下载数据。因此,当我切换选项卡时,该应用程序会闪烁(旋转条显示的时间很短)。我试图通过将Firestore流移动到构造函数来解决此问题。但是,由于流可以在构建方法之前发出,因此它将永远加载。
一个解决方案可能是保存最后发出的值。我尝试使用Rx中的shareReplay方法来解决此问题,但尚未在RxDart中实现。那么,实现此目标的最佳实践是什么?
答案 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。