Я уже дважды сталкивался со следующей проблемой в моем приложении:Внутри 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.
);
}
}
Кто-нибудь получил представление о том, как я могу решить такую проблему во флаттере?