【发布时间】:2020-02-23 23:02:34
【问题描述】:
我无法让自定义画家重新绘制。 我尝试使用 Listenable、回调、setState 并没有重绘屏幕。
文档是这样说的:
触发重绘的最有效方法是:
- 扩展此类并向 CustomPainter 的构造函数提供一个重绘参数,该对象会在该对象通知其侦听器何时重绘。
- 扩展 Listenable(例如通过 ChangeNotifier)并实现 CustomPainter,以便对象本身直接提供通知。 在任何一种情况下,CustomPaint 小部件或 RenderCustomPaint 渲染对象都会在动画滴答时侦听 Listenable 并重新绘制,从而避免管道的构建和布局阶段。
但代码没有按预期工作。
这是我正在使用的代码:
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
main() {
runApp(MaterialApp(
home: Scaffold(appBar: AppBar(), body: Pad()),
));
}
class Pad extends StatefulWidget {
@override
_PadState createState() => _PadState();
}
class _PadState extends State<Pad> {
@override
Widget build(BuildContext context) {
final painter = Painter();
return GestureDetector(
onTap: () {
setState(() {
painter.addY(10);
});
},
child: CustomPaint(
painter: painter,
child: Container(),
));
}
}
class Painter extends CustomPainter {
double y = 10;
addY(val) {
y += val;
}
@override
void paint(Canvas canvas, Size size) {
canvas.drawCircle(Offset(size.width / 2, y++), 100, Paint());
}
@override
bool shouldRepaint(Painter oldDelegate) {
return true;
}
}
【问题讨论】: