Boo*_*unz 6 custom-view flutter flutter-custompainter flutter-custompaint
在 Flutter 中,创建CustomPainter时,有一个重写方法,shouldRepaint(),您可以返回 true 或 false...大概是为了告诉系统是否重新绘制视图。
\n在文档中,该方法的描述是:
\n\n\nshouldRepaint(covariant CustomPainter oldDelegate) \xe2\x86\x92 bool 每当向 RenderCustomPaint 对象提供\n自定义绘制委托类的新实例时\n或在使用该对象的新实例创建新的\nCustomPaint 对象时调用\n自定义\npainter委托类(这相当于同一件事,因为后者是根据前者实现的)。[...]
\n
除了它返回一个布尔值之外,我基本上不明白任何其他内容。这让我很头疼!我还怀疑深入研究“自定义画家委托类”或“RenderCustomPaint 对象”的定义不会是一种启发性的体验。
\n我很困惑,因为:
\n我认为我们不必担心小部件何时“应该重新绘制”,因为 Flutter 应该根据其自身复杂的优化决策来决定何时何地重新渲染小部件树。
\n我认为 Paint() 方法是您定义“这就是该视图如何绘制自身的方式,(无论何时何地有必要)”的地方
\n我发现的所有示例都只是从该方法返回 false...但我注意到使用 true 与 false 时的不同行为。
\n如果我们总是返回 false,那么它如何重新绘制呢?(即使是假的,它也会重新绘制)
\n如果我们唯一可用的逻辑是将“oldDelegate”与(某物?)进行比较,那么为什么我们需要重写该方法呢?
\n我还没有看到任何示例来演示为什么或如何返回 TRUE,以及为了做出该决定而这样的示例的逻辑是什么样的。
\n一个有知识的人为什么以及如何决定返回 false?
\n一个有知识的人为什么以及如何决定回归真实?
\n谁能像你在和一个 13 岁的孩子(不是 Linus Torvalds)说话一样解释它?
\n一个简单的代码示例和反例会很棒(而不是详尽的明确解释!)
\nfzy*_*cjy 10
我广泛使用了 CustomPainter,这是我的答案。
首先,这是完整的文档。您可能只阅读了开头句子,而不是完整的文档。https://api.flutter.dev/flutter/rendering/CustomPainter/shouldRepaint.html
一个知识渊博的人为什么以及如何决定返回 false/true?
规则如下: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;
}
Run Code Online (Sandbox Code Playgroud)
我认为我们不必担心小部件何时“应该重新绘制”,因为 Flutter 应该根据其自身复杂的优化决策来决定何时何地重新渲染小部件树。
是和不是。这个 shouldRepaint() 基本上是对速度的优化。如果你不关心性能,你可以不断返回 true。
我认为 Paint() 方法是您定义“这就是该视图如何绘制自身的方式,(无论何时何地有必要)”的地方
“这就是这种观点的描述方式”——是的。“无论何时何地有必要”——部分没有。如果你向 shouldRepaint() 提供了错误的信息,你可能会错过一些绘画。
我发现的所有示例都只是从该方法返回 false...但我注意到使用 true 与 false 时的不同行为。
什么???我看到人们返回 true,或者返回比较(参见下面的示例)。但当返回 false 时,可能会导致问题。即使简单地看一下这个函数的注释,你也会发现它应该会导致常量 false 的问题。但无论如何,如果你的画家确实不包含任何可以改变的信息,那也没关系......
如果我们总是返回 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).
Run Code Online (Sandbox Code Playgroud)
请注意“可能”和下面的段落。Flutter可以选择绘制或不绘制。
如果我们唯一可用的逻辑是将“oldDelegate”与(某物?)进行比较,那么为什么我们需要重写该方法呢?
看我的例子
我还没有看到任何示例来演示为什么或如何返回 TRUE,以及为了做出该决定而这样的示例的逻辑是什么样的。
看我的例子
顺便说一句,如果您对 Flutter 有了一些了解,例如 widget/layout/paint 逻辑等,那就太好了,那么您将很容易理解问题。但无论如何,我在上面的回答中使用了希望即使没有深入了解 Flutter 也能轻松理解的词语。
| 归档时间: |
|
| 查看次数: |
1892 次 |
| 最近记录: |