我有一个带有一个子小部件的简单AnimatedWidget
。
AnimatedContainer(
duration: Duration(milliseconds: 2000),
curve: Curves.bounceOut,
decoration: BoxDecoration(
color: Colors.purple,
),
child: FlutterLogo(
size: _boxSize,
),
),
其中_boxSize
的动画设置如下:
void _startAnimation() => setState(() {
_boxSize *= 1.7;
});
但是, AnimatedContainer
对于子小部件不起作用。您需要更改AnimatedContainer
的直接属性才能使动画正常工作。
这符合文档规定:
The [AnimatedContainer] will automatically animate between the old
and new values of properties when they change using the provided curve
and duration. Properties that are null are not animated.
Its child and descendants are not animated.
AnimatedContainer
的等价是什么,还可以为其子代动画?
答案 0 :(得分:2)
很少有可以使孩子动起来的小部件。您可以使用AnimatedSwitcher
小部件将新的flutter徽标小部件交换为首选大小。
答案 1 :(得分:0)
没有魔术部件可以简单地递归给所有孩子动画。但我认为您想要的是一个隐式动画小部件。即。您可以更改窗口小部件的构造函数参数,并随着其更改将动画从一个值移动到另一个值。
最简单的方法可能是将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
对象。