大家好,我有一个问题,我不了解AnimatedWidget
和AnimatedBuilder
之间的区别。源代码中的注释如下:
AnimatedWidget:
/// For more complex case involving additional state, consider using
/// [AnimatedBuilder].
AnimatedBuilder:
/// For simple cases without additional state, consider using
/// [AnimatedWidget].
我想知道如何在它们之间进行选择,因为我不太了解文档,谢谢!
答案 0 :(得分:2)
animatedWidget 和 animatedBuilder 都执行与动画有关的相同工作。
继续前进之前,必须知道要创建动画,我们至少需要满足以下两个条件: 1。。动画本身和 2。。我们将在其上应用动画的小部件。
之间的清晰区别是:
AnimatedWidget 仅将动画作为参数,而 AnimatedBuilder 则使用两个参数“ child”和“ animation”。
AnimatedWidget 被实现为扩展 AnimatedWidget 的类。 例如
abc类扩展了AnimatedWidget
AnimatedBuilder 被实现为类中的小部件。 例如
child:AnimatedBuilder(.....),
现在,尽管两者都执行相同的工作,但两者的执行方式不同。在AnimatedWidget中,它具有自己的子代,因此我们只需要传递动画。而在 AnimatedBuilder 中,我们需要同时传递子代和动画。
以 AnimatedWidget 为例,您可以将相同的AnimatedWidget类用于具有不同值的任意数量的动画。
现在您会想到,如果 AnimatedWidget 可以做到为什么我们需要 AnimatedBuilder ?
答案很简单
要更改 AnimatedWidget 中的动画,需要更改呈现徽标或我们的孩子的窗口小部件。因此, AnimatedBuilder 所做的就是提供一个选择,即同时传递您选择的子对象和动画。
答案 1 :(得分:1)
除了使用它们所需的语法外,它们之间没有真正的区别。
要清楚,这是AnimatedBuilder
的代码:
class AnimatedBuilder extends AnimatedWidget {
const AnimatedBuilder({
Key key,
@required Listenable animation,
@required this.builder,
this.child,
}) : assert(builder != null),
super(key: key, listenable: animation);
final TransitionBuilder builder;
final Widget child;
@override
Widget build(BuildContext context) {
return builder(context, child);
}
}
...是的,什么都不做
从此代码中,我们可以清楚地看到AnimatedBuilder
只是使用AnimatedWidget
的另一种语法。由于AnimatedBuilder
是AnimatedWidget
,将所有布局逻辑委托给回调函数
最后,这完全取决于您。两者都做同样的事情。使用使您更易读的内容