Flutter - виджет анимации, запускает анимацию только один раз, но получает обновления данных на виджете - PullRequest
0 голосов
/ 28 октября 2019

Я уже дважды сталкивался со следующей проблемой в моем приложении:Внутри StatefulWidget у меня есть виджет, который содержит анимацию и дополнительно отображает другие динамические данные. Анимация запускается после создания виджета анимации. Однако после воспроизведения анимации (рисования фигуры) я хочу сохранить ее в том же рисованном состоянии. Остальные динамические данные виджета должны всегда перестраиваться при вызове родительского метода StatefulWidget build. Ниже приведен простой пример того, чего я пытаюсь достичь:

class MyStatefulWidget extends StatefulWidget {

  MyStatefulWidget({Key key, @required this.data}) : super(key: key);

  CustomData data;

  @override
  State<StatefulWidget> createState() => _MyState();
}

Теперь у меня было две идеи о том, как реализовать государство:1) Инициализируйте виджет анимации в initState() и «вручную» обрабатывайте обновления данных в didUpdateWidget().

class _MyState extends State<MyStatefulWidget> {
  AnimationWidget _animationWidget;

  @override
  void initState() {
    super.initState();
    _animationWidget = AnimationWidget(displayData: widget.data);

    // starts the animation when the widget is built (?)
    WidgetsBinding.instance
        .addPostFrameCallback((_) => _animationWidget.startAnimation());
  }

  @override
  Widget build(BuildContext context) {
    return Column(
          children: [
          _animationWidget,
          ... // other content
          ],
          ... // column size etc.
    );
  }

  @override
  void didUpdateWidget(SackenNotebookContent oldWidget) {
    super.didUpdateWidget(oldWidget);

    if(dataChanged(oldWidget.data, widget.data))
        setState(() {
        _animationWidget = AnimationWidget(displayData: widget.data);
        });
  }
}

2) Чтобы создать виджет анимации в методе build(). Но тогда у меня уже есть сомнения относительно того, когда / где запустить анимацию, чтобы начать. Одним из способов было бы вызвать его в didUpdateWidget(). Но опять же, анимация будет запускаться при каждой перестройке виджета ...

class _MyState extends State<MyStatefulWidget> {

  @override
  Widget build(BuildContext context) {
    var animationWidget = AnimationWidget(displayData: widget.data);

    // but where to call animationWidget.startAnimation() ?!
    // when I call it here I get a null pointer exception...

    return Column(
          children: [
          animationWidget,
          ... // other content
          ],
          ... // column size etc.
    );
  }
}

Кто-нибудь получил представление о том, как я могу решить такую ​​проблему во флаттере?

...