Нет волшебного виджета, который бы просто рекурсивно оживлял всех детей. Но я думаю, что вы хотите, это неявно анимированный виджет. то есть. вы изменяете параметры конструктора виджета, и при его изменении он анимируется от одного значения к другому.
Самый простой способ - это ImplicitlyAnimatedWidget
с AnimatedWidgetBaseState
. Так что для вашего примера для анимации атрибута boxSize
это может выглядеть так:
class AnimatedFlutterLogo extends ImplicitlyAnimatedWidget {
const AnimatedFlutterLogo({Key key, @required this.boxSize, @required Duration duration})
: super(key: key, duration: duration);
final double boxSize;
@override
ImplicitlyAnimatedWidgetState<ImplicitlyAnimatedWidget> createState() => _AnimatedFlutterLogoState();
}
class _AnimatedFlutterLogoState extends AnimatedWidgetBaseState<AnimatedFlutterLogo> {
Tween<double> _boxSize;
@override
void forEachTween(visitor) {
_boxSize = visitor(_boxSize, widget.boxSize, (dynamic value) => Tween<double>(begin: value));
}
@override
Widget build(BuildContext context) {
return Container(
child: FlutterLogo(
size: _boxSize?.evaluate(animation),
),
);
}
}
, который, на мой взгляд, уже довольно лаконичен, единственная реальная шаблонная схема - это в основном метод forEachTween(visitor)
, который должен создавать Tween
объекты для всех свойств, которые вы хотите анимировать.