flutter 如何在阅读后从StreamBuilder中删除数据?

6xfqseft  于 2023-06-30  发布在  Flutter
关注(0)|答案(4)|浏览(169)

我想在读取数据流后将其删除。
基本上,我想要与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,就像它收到新数据一样。
对不起,我应该从这里开始...

2fjabf4q

2fjabf4q1#

胺的答案似乎是最好的,但我也想分享我的解决方案,也许它会帮助一些人。
在我执行了我的代码之后,我将一个空对象传递给我的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());
  }
2exbekwf

2exbekwf2#

我在使用StreamBuilder时也遇到过类似的问题,我找了好几天都找不到解决方案。我所做的是使用一个ListView构建器,它从InheritedWidget获取数据。
因此,基本上不必将数据放入流接收器,我只需将InheritedWidget中的数据设置器 Package 在setState()中,每次更改数据时,ListView都会重新构建。
B:我的StreamBuilder也涉及到一个Map,我一直认为这是一个干扰它,但我从来没有解决这个问题。与您的情况一样,每次更改状态时,流都会使用以前的相同数据重新构建。

5hcedyr0

5hcedyr03#

在我的应用程序中有类似的问题。
我发现的工作方式非常简单-全局变量,默认情况下它什么也不做(本例中为“false”)。但是在需要调用setState()的方法中,在重建widget时将此变量值更改为block next snapshot.data(在此示例中,值“true”将阻塞)。
记得将变量更改为默认值,否则不会获得新的流更新。

// global variable - doing nothing by default
    bool _clear = false;
    (...)
    /// Add additional condition
    if (mapController.ready && snapshot.hasData && !_clear) {
      tag = snapshot.data;
      mapController.move(
        LatLng(tag.position.latitude, tag.position.longitude),
        mapController.zoom);
    }
    /// change variable to default value
    _clear = false;
    return RubberBottomSheet(...);
    ),
(...)
// some method calling setState
void _clearMethod() {
    _clear = true;
    setState(() {});
}
bpsygsoo

bpsygsoo4#

我遇到了类似的问题,当你检查条件流.hasData时,即使你已经“使用”了该信息,它也会触发,所以我所做的就是使用数据的hashCode来识别数据。
基本上,我有一个int变量存储以前的数据hashCode,当检查流是否有数据时,我也会检查该数据的hashCode是否与以前的不同,换句话说,如果它是一个新数据。像这样:

// variable declared at the page state, before the build() method
int? lastHashStream;

// now inside the StreamBuilder builder method, before returning any widget
if (snapshot.hasData) {
  if (lastHashStream == null || snapshot.data.hashCode != lastHashStream) {
    lastHashStream ??= snapshot.data.hashCode;
    // your commands
  } // else is when there has been some message and it is the same as the previous
}

它不会从流中删除数据,但你可以检查它是否是新数据,这对我来说已经足够了,我希望它能有所帮助。

相关问题