【发布时间】:2018-12-29 04:24:25
【问题描述】:
我读到 Filip Hracek @filiph 的一篇文章
流的异步性带来的一个缺点是,当您构建 StreamBuilder 时,它总是首先显示 initialData(因为它是同步可用的),然后才显示来自 Stream 的第一个事件。这可能导致丢失数据的闪烁(一帧)。有一些方法可以防止这种情况发生 — 敬请期待更详细的文章。
我正面临这个问题,我需要知道防止闪光的方法。如果有人知道路,那就太好了。我正在向我的接收器添加新数据,然后访问我的流构建器快照以获取数据。但是,如果我使用 rxdart,它会返回 null 或某个种子值的初始数据。我想要最新的数据,我尝试使用async- await,但没有帮助。我在 Map 中设置 snapshot.data 值,索引与我的 itemBuilder 关联。
这是一个示例代码
return ListView.builder(
itemBuilder: (context, int index){
return checkboxListTile(
title: Text(xyz)
value: valueMap[key[index]];
onChanged:(value){bloc.myController.sink.add(value);
valueMap[key[index]] = snapshot.data;}
);
}
);
snapshot.data 返回旧值。所以它基本上落后了一步。我理解这是一个asynchronous 和synchronous 问题。但我需要一个方法。
【问题讨论】:
-
没有办法让 Stream 监听同步。我不确定“有办法防止这种情况 ”是什么意思,但我不知道。
-
你可以有一个同步流——但是订阅它仍然是异步的。
-
所以@JonahWilliams,你建议我如何正确获取丢失的数据集。快照中的数据滞后一步。因此,我必须每次点击两次才能使 onChanged 函数正常工作。可能是 Filip Hracek( filiph ) 可以回答,但由于声望点低,我无法标记他。有人可以在这里标记他。自从他写了那篇文章。
-
这听起来更像是你缺少一个 setState,你能在你的 onChanged 回调中添加一个吗?
-
只是为了确认一下:@GoPro,您所看到的实际上只是旧数据的一帧(一帧),对吗?还是您的 StreamBuilder 使用以前的版本构建,然后从不更新(直到用户操作)?这些是不同的问题。