我喜欢这个很好的例子:https://resocoder.com/2019/04/06/flutter-nosql-database-sembast-tutorial-w-bloc/
如果表明您可以执行以下操作:
if (event is LoadFruits) {
// Indicating that fruits are being loaded - display progress indicator.
yield FruitsLoading();
yield* _reloadFruits();
}
尽管在示例中它起作用,但是当我将其部署到我的应用程序中时,我注意到BlocBuilder
并不总是收到第一个FruitsLoading状态
我的情况几乎与我要做的差不多:
yield ReceiptUpdated(updatedReceipt);
yield* _reloadReceipts();
即主要区别是我随事件通过了记录。
我注意到以下情况:
在运行带有断点的调试器时,ReceiptUpdated将被接收,并且应用程序正常运行(这表明在框架级别存在竞争状况)
以正常模式运行,并注释行yield* _reloadReceipts();
将导致接收到ReceiptUpdated
更改顺序:
yield * _reloadReceipts(); 产生ReceiptUpdated(updatedReceipt);
将导致接收到ReceiptUpdated,但是丢失了ReceiptsLoaded
这是一个错误吗?
像示例中一样,yield
的一个接一个声明是合法的吗?
有人可以阐明这一点吗?
注意:
我有3个屏幕a,b,c,其中b和c都是a的子屏幕。
拍照后,我立即使用屏幕b拍摄收据的图片:
收据已上传到SRV
该应用会弹出回到,其中列出了新收据
然后,当您在屏幕a上单击收据时,它会显示u屏幕c上的收据,其中显示了一个CircleProgressIndicator,直到上传完成为止,这触发了ReceiptUpdated被触发(但未收到...)>
我发现奇怪的是,即使没有ReceiptUpdated状态,收据也应该进行了更新,因为父级(a)从数据库接收到带有新数据的ReceiptsLoaded,并重建自身及其子级。
如果我停留在屏幕b上,至少这是这样的。
所以它要么是非常令人迷惑的功能,要么是错误,或者我做的是完全错误的事情。
有人可以帮我解决这个问题吗?
注意2:
我通过引入新状态NeedReloadReceipt
并添加代码来解决此问题:
if (state is ReceiptUpdated) {
_receiptBloc.dispatch(NeedReloadReceipt());
}
在我的应用主构建器中
这样我只需要在集团中解雇ReceiptUpdated
,并且仅在收到ReceiptsLoaded
之后解雇ReceiptUpdated
。