Flutter中的AnimatedWidget和AnimatedBuilder

时间:2018-08-05 13:43:48

标签: flutter flutter-animation

大家好,我有一个问题,我不了解AnimatedWidgetAnimatedBuilder之间的区别。源代码中的注释如下:

AnimatedWidget:

/// For more complex case involving additional state, consider using
/// [AnimatedBuilder].

AnimatedBuilder:

/// For simple cases without additional state, consider using
/// [AnimatedWidget].

我想知道如何在它们之间进行选择,因为我不太了解文档,谢谢!

2 个答案:

答案 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的另一种语法。由于AnimatedBuilderAnimatedWidget,将所有布局逻辑委托给回调函数

最后,这完全取决于您。两者都做同样的事情。使用使您更易读的内容