被比较的对象是List时如何实现shouldRepaint?

How to implement shouldRepaint when the object being compared is a List?

假设在 Flutter 中我们有一个像这样的 Custom Painter,它将 List 作为参数:

class StackPainter02 extends CustomPainter {
  final List<double> brightnessValues;
  late final int numberOfBulbs;

  StackPainter02(
      {required this.brightnessValues}) {

    numberOfBulbs = brightnessValues.length;

  }

  @override
  void paint(Canvas canvas, Size size) {

    // ...

  }

  @override
  bool shouldRepaint(covariant StackPainter02 oldDelegate) {
    return (oldDelegate.brightnessValues != brightnessValues); // ??? does not seem to work
    //return true;
  }
}

在 shouldRepaint() 中,我怀疑这不起作用的原因与比较列表在 Dart 中的工作方式有关,并且比较两个列表总是 return false,即使它们的内容相同.

...而且我们必须使用某种类型的特殊比较,例如 this answer?

但是,我不希望像这样必须遍历整个列表来比较每个值,从而影响性能。

假设它可能是内存中的同一个对象,是否有某种方法可以通过询问“它是内存中的同一个实际对象”来比较“两个”列表?

这正是 == 所做的。举个例子:

  final l1 = <int>[1, 2, 3];
  final l2 = <int>[1, 2, 3];
  final l3 = l1;
  print(l1 == l2);  // prints false
  print(l1 == l3);  // prints true

  l1[2] = 4;
  print(l3); // prints [1, 2, 4];

两个不同的列表,尽管内容相同,但不是==,但可以通过详尽检查其内容进行比较。

但在此示例中,l3l1 是同一个列表 - 因此 == 为真。 (请注意修改 l1 也会修改 l3.