1

我有一个CustomPainter类似的例子。我并不总是需要重新绘制,但我需要保留之前绘制的路径,因为它用于hitTest. 在构造函数中创建 也不是解决方案,path因为在方法中获得的 Sizepaint用于创建path.

在这个例子中,progress可以从 0.0 到 1.0,但是很多时候它保持在 1.0,在这种情况下,它不需要重新绘制,但是 hitTest 需要知道点击事件是否在里面的路径path,在这种情况下,progress始终为 1.0,shouldRepaint那么只要不更改,它就会为 null,这会导致未正确检测到 hitTest false。我不认为总是重绘是一个好主意,因为路径永远不会在1.0 时改变,但如果它是唯一的选择,我不会反对。pathprogressprogress

class CoolPainter extends CustomPainter {
  final double progress;

  CoolPainter({required this.progress});

  static Path _drawRectHole(Size size) {
    return Path()
      //Cool Drawing stuff.
      ..close();
  }

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

    canvas.drawPath(
      path!,
      Paint()
        ..style = PaintingStyle.fill,
    );
  }

  @override
  bool hitTest(Offset position) {
    return path!.contains(position);
  }

  @override
  bool shouldRepaint(CoolPainter oldDelegate) {
    return oldDelegate.progress != progress;
  }
}

- 编辑 -

主要问题是当 shouldRepait 为 false 时 path 为 null,这会在 hitTest 中产生错误。progress是从 2 个不同的 Animation 对象中获得的,具体取决于在painter 之外处理的情况

4

0 回答 0