Flutter CustomPaint不重新粉刷

时间:2019-10-28 16:43:54

标签: android flutter dart

我无法使自定义画家重新绘画。 我尝试使用Listenable,回调,setState,但没有任何东西可以重绘屏幕。

医生说:

  

触发重绘的最有效方法是:

     
      
  • 扩展此类,并向CustomPainter的构造函数提供一个重绘参数,该对象在需要重绘时通知其侦听器。
  •   
  • 扩展可监听(例如通过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;
  }
}

1 个答案:

答案 0 :(得分:0)

Listenable正常工作,例如使用ValueNotifier,有关示例代码,请参见https://github.com/pskink/matrix_gesture_detector/blob/master/example/lib/custom_painter_demo.dart