我想在读取数据流后将其删除。
基本上,我想要与Go中的通道相同的系统。
所以,如果我加上5,3和2,我的流包含5,3和2。
当我开始阅读时,我得到5,我的流现在包含3和2等...
这可能吗?
编辑:这里是我的一些代码的问题。
我使用StreamBuilder来接收数据。当我改变状态时,它再次触发我的函数,就像我刚刚接收数据一样。
child: StreamBuilder<Tag>(
stream: widget.tagStream,
initialData: Tag(),
builder: (BuildContext context, AsyncSnapshot<Tag> snapshot) {
/// This should be trigger only when I receive data
if (mapController.ready && snapshot.hasData) {
tag = snapshot.data;
mapController.move(
LatLng(tag.position.latitude, tag.position.longitude),
mapController.zoom);
}
return RubberBottomSheet(...);
),
这里有一些背景:
我有一张Map,上面有代表物体的图标。当我点击一个图标或者如果我在搜索栏上搜索相关的项目时,会出现一个RubberBottomSheet来显示有关该对象的信息。要做到这一点,我使用一个StreamBuilder,所以我只需要把点击或搜索的对象放在里面,让我的橡皮出现并填充。我还需要在我的图标中心,让用户知道在哪里的对象。我的问题是,当我打开或关闭我的键盘或当我使用一个setState(例如改变我的搜索栏的外观),它会自动触发StreamBuilder,就像它收到新数据一样。
对不起,我应该从这里开始...
4条答案
按热度按时间2fjabf4q1#
胺的答案似乎是最好的,但我也想分享我的解决方案,也许它会帮助一些人。
在我执行了我的代码之后,我将一个空对象传递给我的Stream。我只需要在执行代码之前验证我的对象不是空的,一切都像魔法一样工作。
2exbekwf2#
我在使用
StreamBuilder
时也遇到过类似的问题,我找了好几天都找不到解决方案。我所做的是使用一个ListView
构建器,它从InheritedWidget
获取数据。因此,基本上不必将数据放入流接收器,我只需将
InheritedWidget
中的数据设置器 Package 在setState()
中,每次更改数据时,ListView
都会重新构建。B:我的
StreamBuilder
也涉及到一个Map,我一直认为这是一个干扰它,但我从来没有解决这个问题。与您的情况一样,每次更改状态时,流都会使用以前的相同数据重新构建。5hcedyr03#
在我的应用程序中有类似的问题。
我发现的工作方式非常简单-全局变量,默认情况下它什么也不做(本例中为“false”)。但是在需要调用setState()的方法中,在重建widget时将此变量值更改为block next snapshot.data(在此示例中,值“true”将阻塞)。
记得将变量更改为默认值,否则不会获得新的流更新。
bpsygsoo4#
我遇到了类似的问题,当你检查条件流.hasData时,即使你已经“使用”了该信息,它也会触发,所以我所做的就是使用数据的
hashCode
来识别数据。基本上,我有一个int变量存储以前的数据hashCode,当检查流是否有数据时,我也会检查该数据的hashCode是否与以前的不同,换句话说,如果它是一个新数据。像这样:
它不会从流中删除数据,但你可以检查它是否是新数据,这对我来说已经足够了,我希望它能有所帮助。