我使用
fl_chart
显示实时数据,该数据每 0.5 秒就会出现在我的图表小部件中。
它需要一个点列表,在我的例子中,该列表的大小应限制为 120 个元素。
新值显示在图表右侧,然后移至左侧 - 这是一个示例:
我使用下面的代码来添加、移动和删除值:
List<FlSpot> measureValues = [FlSpot.zero, const FlSpot(60, 0)];
if (bloc.isResponseValid(liveData)) {
measureValues = measureValues.map((obj) => FlSpot(obj.x - 0.5, obj.y)).toList();
measureValues.add(
FlSpot(
60,
double.parse(
liveData.current!.toStringAsFixed(liveData.precision),
),
),
);
if (measureValues.length > 120) {
measureValues.removeAt(0);
}
}
但是,由于顺序执行,我的图形会摆动两次 - 第一次是在添加元素时,第二次是在删除元素时。我想确保这两个操作将同时执行。我可以以某种方式使这些操作原子化吗?
我已经尝试过:
tmp
列表上执行这些操作,然后将结果传递给原始 measureValues
列表 - 结果是相同的;ListQueue
- 只要我需要移动整个图表,我需要在这个队列上执行.map
,将其切换到Iterable
,所以不幸的是我无法再次回到ListQueue
。我将非常感谢任何帮助。预先感谢!
List<FlSpot> measureValues = [FlSpot.zero, const FlSpot(60, 0)];
if (bloc.isResponseValid(liveData)) {
final List<FlSpot> buffer = measureValues.map((obj) => FlSpot(obj.x - 0.5, obj.y)).toList(); // you can use any temporary object.
buffer.add(
FlSpot(
60,
double.parse(
liveData.current!.toStringAsFixed(liveData.precision),
),
),
);
if (buffer.length > 120) {
buffer.removeAt(0);
}
measureValues=buffer
}
或者您可以创建自己的原子数据结构。 让我知道这是否有帮助