我不能让定制的油漆工重新粉刷。我试着使用Listable,回调,setState,没有任何东西重新绘制屏幕。
文档是这样说的:
触发重绘的最有效方法是:
- 扩展这个类并向CustomPainter的构造函数提供一个重绘参数,在该构造函数中,该对象在需要重绘时通知它的侦听器。
- 扩展列表(例如通过ChangeNotifier)并实现CustomPainter,以便对象本身直接提供通知。无论哪种情况,CustomPaint构件或RenderCustomPaint渲染对象都将侦听Listable并在动画滴答时重新绘制,从而避免管道的构建和布局阶段。
但代码并没有按预期工作。
这是我正在使用的代码:
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;
}
}
字符串
3条答案
按热度按时间pcww981p1#
Listenable
工作得很好,使用ValueNotifier
为例,请参阅https://github.com/pskink/matrix_gesture_detector/blob/master/example/lib/custom_painter_demo.dart获取一些示例代码yptwkmov2#
我不知道为什么,但当我添加一个空的
DropdownButtonFormField
小部件时,它工作了。即使
shouldRepaint
函数也总是返回false
。当点击GestureDetector
时,paint
函数总是重新调用。字符串
ycggw6v23#
对于“D c H i Tr n”代码,只需删除SizedBox()并将shouldRepaint返回值更改为'true',然后它就可以正常工作了。