Перерисовать CustomPaint без обновления состояния / перестройки виджета? - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь понять, как работает customPaint, я хочу нарисовать индивидуальную покадровую анимацию на холсте.

Я могу заставить ее работать, перерисовывая виджет каждые 1/60 секунды, но это звучит не очень эффективно. Я хотел бы рендерить CustomPainter каждые 1/60 секунды, но это, похоже, не работает. Любая заметка или замечание очень важно, чтобы помочь мне понять, как я должен достичь этого. Спасибо.

Это код, с которым я работаю:

class CustomAnimatedWidgetState extends State<CustomAnimatedWidget> {

  CustomPaint _paint=null;
  MyCustomPainter _painter=null;

  double animationFrame=0;

  void tick() {   
    //called eery 1/60 seconds 
    animationFrame+=1/60;
    _painter.setAnimationFrame(animationFrame);
    _paint.METHOD_I_DONT_KNOW_TO_FORCE_REDRAW();
    // I want to avoid setState({animationFrame+=1/60;}); which works actually, but that doesn't sound very efficient to redraw the widget every 1/60 seconds, unless it's the right way to do it ?
  }


  @override
  Widget build(BuildContext context) {
    //developer.log('axis='+axis.toString(), name: 'DEBUG');


    _painter=MyCustomPainter();
    _painter.setAnimationFrame(animationFrame);

    _paint=CustomPaint(
      painter: _painter,
      child: Container(),
    );

    return _paint;
  }
}

1 Ответ

1 голос
/ 23 апреля 2020

Спасибо @pskink за подсказку в комментариях, вот рабочее решение, использующее ChangeNotifier при вызове конструктора класса MyCustomPainter.

class CustomAnimatedWidgetState extends State<CustomAnimatedWidget> {

  CustomPaint _paint=null;
  MyCustomPainter _painter=null;
  ChangeNotifier _repaint=ChangeNotifier();

  double animationFrame=0;

  void tick() {   
    //called eery 1/60 seconds 
    animationFrame+=1/60;
    _painter.setAnimationFrame(animationFrame);
    _repaint.notifyListeners();
  }


  @override
  Widget build(BuildContext context) {
    _painter=MyCustomPainter(repaint:_repaint);
    _painter.setAnimationFrame(animationFrame);

    _paint=CustomPaint(
      painter: _painter,
      child: Container(),
    );

    return _paint;
  }
}
...