使用可收听的

时间:2019-08-23 22:16:15

标签: flutter dart

CustomPainter类似乎有几种触发重新绘制的方法。

我让我的画家使用shouldRepaint方法工作,但是,我希望我的画家以可听的方式对更改做出反应,而不是轮询更改。

Flutter文档指出

  

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

     

扩展此类,并为CustomPainter的构造函数提供一个重绘参数,该对象在需要重绘时通知其侦听器。   扩展Listenable(例如,通过ChangeNotifier)并实现CustomPainter,以便对象本身直接提供通知。

我尝试过将侦听器传递给Custom Painter,但是当侦听器更新时,未按照文档中的说明调用paint方法

  

无论哪种情况,只要动画滴答,CustomPaint小部件或RenderCustomPaint渲染对象都将侦听Listenable并重新绘制

class CursorPainter extends CustomPainter {
  Listenable _repaint;
  Player player;
  BuildContext context;

  // Pass in repaint (listenable)
  CursorPainter({repaint, this.context}) {
    _repaint = repaint;
    player = Provider.of<Player>(context, listen: false);
  }

  @override
  void paint(Canvas canvas, Size size) {
  // Paint logic...
  }

  @override
  bool shouldRepaint(CursorPainter lastTrackPainter) {
     // Tried returning both true and false here to no avail. Method is continually called.
  }
}


我希望每次可监听对象发生更改并调用notifyListeners()时,CustomPainter都会按照文档中的说明重新绘制自身。

1 个答案:

答案 0 :(得分:1)

在构造函数中,调用super,...

  CursorPainter({repaint, this.context}) {
    super(repaint: repaint);
    _repaint = repaint;
    player = Provider.of<Player>(context, listen: false);
  }