StreamBuilder读取数据后如何删除?

Ama*_*ite 6 stream dart flutter

我想在读取数据后将其从流中删除。
基本上我想要与 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(...);
),
Run Code Online (Sandbox Code Playgroud)

这里有一些上下文:
我有一张带有代表对象的图标的地图。当我单击图标或在搜索栏上搜索相关项目时,会出现一个 RubberBottomSheet,显示有关该对象的信息。为此,我使用 StreamBuilder,因此我只需将单击或搜索的对象放入其中即可使我的橡胶出现并填充。我还需要以图标为中心,让用户知道该对象在哪里。我的问题是,当我打开或关闭键盘或使用 setState(例如更改搜索栏的外观)时,它会自动触发 StreamBuilder,就像它收到新数据一样。

抱歉,我应该从这里开始......

Ama*_*ite 5

Amine的答案似乎是最好的,但我也想分享我的解决方案,也许它会对某些人有所帮助。

执行代码后,我将一个空对象传递到我的 Stream。我只需要在执行代码之前验证我的对象不为空,一切都会顺利进行。

builder: (BuildContext context, AsyncSnapshot<Tag> snapshot) {
  if (mapController.ready &&
      snapshot.hasData &&
      snapshot.data.mobile.nid != 0) {
    tag = snapshot.data;
    ... /// My code
    widget.tagStream.sink.add(Tag());
  }
Run Code Online (Sandbox Code Playgroud)


Ami*_*ine 4

我也有过类似的行为StreamBuilder,但好几天都找不到解决方案。我所做的是使用一个ListView从 an 获取数据的构建器InheritedWidget

因此,基本上不必将数据放入流接收器中,我只需将数据设置器包装在InheritedWidgeta 中setState(),并ListView在每次更改数据时进行重建。

注意:我StreamBuilder还涉及到一张地图,我一直认为是它干扰了它,但我从未解决过这个问题。就像您的情况一样,每次我更改状态时,流都会使用之前的相同数据进行重建。