在 Dart 中使添加+删除操作原子化

问题描述 投票:0回答:1

我使用

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);
      }
    }

但是,由于顺序执行,我的图形会摆动两次 - 第一次是在添加元素时,第二次是在删除元素时。我想确保这两个操作将同时执行。我可以以某种方式使这些操作原子化吗?

我已经尝试过:

  1. 在某些
    tmp
    列表上执行这些操作,然后将结果传递给原始
    measureValues
    列表 - 结果是相同的;
  2. 使用
    ListQueue
    - 只要我需要移动整个图表,我需要在这个队列上执行
    .map
    ,将其切换到
    Iterable
    ,所以不幸的是我无法再次回到
    ListQueue

我将非常感谢任何帮助。预先感谢!

flutter dart atomic
1个回答
0
投票
    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
    }

或者您可以创建自己的原子数据结构。 让我知道这是否有帮助

© www.soinside.com 2019 - 2024. All rights reserved.