被比较的对象是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];
两个不同的列表,尽管内容相同,但不是==
,但可以通过详尽检查其内容进行比较。
但在此示例中,l3
与 l1
是同一个列表 - 因此 ==
为真。 (请注意修改 l1
也会修改 l3
.
假设在 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];
两个不同的列表,尽管内容相同,但不是==
,但可以通过详尽检查其内容进行比较。
但在此示例中,l3
与 l1
是同一个列表 - 因此 ==
为真。 (请注意修改 l1
也会修改 l3
.