我有一个CustomPainter
类似的例子。我并不总是需要重新绘制,但我需要保留之前绘制的路径,因为它用于hitTest
. 在构造函数中创建 也不是解决方案,path
因为在方法中获得的 Sizepaint
用于创建path
.
在这个例子中,progress
可以从 0.0 到 1.0,但是很多时候它保持在 1.0,在这种情况下,它不需要重新绘制,但是 hitTest 需要知道点击事件是否在里面的路径path
,在这种情况下,progress
始终为 1.0,shouldRepaint
那么只要不更改,它就会为 null,这会导致未正确检测到 hitTest false
。我不认为总是重绘是一个好主意,因为路径永远不会在1.0 时改变,但如果它是唯一的选择,我不会反对。path
progress
progress
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 之外处理的情况