3

在 Flutter 中,在创建CustomPainter时,有一个覆盖方法 shouldRepaint() ,您可以返回 true 或 false ......大概是为了告诉系统是否重新绘制视图。

docs中,该方法的描述是:

shouldRepaint(covariant CustomPainter oldDelegate) → bool 每当向 RenderCustomPaint 对象提供自定义画家委托类的新实例时调用,或者在使用自定义画家委托类的新实例创建新的 CustomPaint 对象时调用(相当于同样的事情,因为后者是根据前者来实现的)。[...]

除了它返回一个布尔值之外,我基本上不理解任何其他内容。这让我很头疼!我还怀疑深入研究“自定义画家委托类”或“RenderCustomPaint 对象”的定义不会是一种启发性的体验。

我很困惑,因为:

  • 我认为我们不必担心小部件何时“应该重新绘制”,因为 Flutter 应该根据自己复杂的优化决策来决定何时何地重新渲染小部件树。

  • 我认为paint() 方法是您定义“这就是该视图自身绘制的方式,(始终以及在必要时)”的地方

  • 我发现的所有示例都只是从此方法返回 false ......但我注意到使用 true 与 false 时的不同行为。

  • 如果我们总是返回 false,那么它如何重新绘制?(即使是假的,它也会重新绘制)

  • 如果我们唯一可用的逻辑是将“oldDelegate”与(某事?)进行比较,那么为什么我们需要重写该方法呢?

  • 我还没有看到任何示例来说明您为什么或如何返回 TRUE,以及为了做出该决定,此类示例的逻辑是什么样的。

一个知识渊博的人为什么以及如何决定返回 false?

一个知识渊博的人为什么以及如何决定回归真实?

谁能解释一下,就像你在和一个 13 岁的孩子(不是 Linus Torvalds)说话一样?

一个简单的代码示例和反例会很棒(而不是详尽的明确解释!)

4

1 回答 1

5

我已经广泛使用了 CustomPainter,这是我的答案。

首先,这是完整的文档。您可能只阅读了开头的句子而不是完整的文档。https://api.flutter.dev/flutter/rendering/CustomPainter/shouldRepaint.html

知识渊博的人为什么以及如何决定返回假/真?

这是规则:If the new instance represents different information than the old instance, then the method should return true, otherwise it should return false.

例子:

class MyPainter extends CustomPainter {
  MyPainter() : super();

  @override
  void paint(Canvas canvas, Size size) => canvas.drawRect(Offset.zero & size, Paint());

  // false since all instances of MyPainter contain same information
  @override
  bool shouldRepaint(MyPainter oldDelegate) => false;
}

class MyPainter extends CustomPainter {
  final Color color;
  final double width;

  MyPainter(this.color, this.width) : super();

  @override
  void paint(Canvas canvas, Size size) => canvas.drawRect(
      Offset.zero & size,
      Paint()
        ..color = color
        ..strokeWidth = width);

  @override
  bool shouldRepaint(MyPainter oldDelegate) => oldDelegate.color != this.color || oldDelegate.width != this.width;
}

我认为我们不必担心小部件何时“应该重新绘制”,因为 Flutter 应该根据自己复杂的优化决策来决定何时何地重新渲染小部件树。

是和不是。这 shouldRepaint() 基本上是对速度的优化。如果您不关心性能,您可以不断返回 true。

我认为paint() 方法是您定义“这就是该视图自身绘制的方式,(始终以及在必要时)”的地方

“这就是这种观点描绘自己的方式” - 是的。“无论何时何地都有必要” - 部分否。如果您向 shouldRepaint() 提供错误信息,您可能会错过一些绘画。

我发现的所有示例都只是从此方法返回 false ......但我注意到使用 true 与 false 时的不同行为。

什么???我看到人们返回真实,或返回比较(见下面我的例子)。但是当返回 false 时,可能会导致问题。即使只是看一下这个函数的注释,你也会发现它应该会导致常量 false 的问题。不过不管怎样,如果你的painter真的不包含任何可以改变的信息,那也没关系……

如果我们总是返回 false,那么它如何重新绘制?(即使是假的,它也会重新绘制)

  /// If the method returns false, then the [paint] call might be optimized
  /// away.
  ///
  /// It's possible that the [paint] method will get called even if
  /// [shouldRepaint] returns false (e.g. if an ancestor or descendant needed to
  /// be repainted). It's also possible that the [paint] method will get called
  /// without [shouldRepaint] being called at all (e.g. if the box changes
  /// size).

注意“可能”和下面的段落。Flutter 可以选择画或不画。

如果我们唯一可用的逻辑是将“oldDelegate”与(某事?)进行比较,那么为什么我们需要重写该方法呢?

看我的例子

我还没有看到任何示例来说明您为什么或如何返回 TRUE,以及为了做出该决定,此类示例的逻辑是什么样的。

看我的例子


顺便说一句,如果你对 Flutter 有一些了解,比如 widget/layout/paint 逻辑等,那你就很容易理解这个问题了。但无论如何,我在上面的回答中使用了希望即使对 Flutter 没有深入了解也易于理解的词语。

于 2021-12-08T10:06:26.793 回答