AnimatedWidget и AnimatedBuilder во флаттере

Привет всем! У меня есть проблема, я не понимаю разницу между AnimatedWidget а также AnimatedBuilder, Комментарии в исходном коде следующие:

AnimatedWidget:

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

AnimatedBuilder:

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

Я хочу знать, как выбирать между ними, потому что я не совсем понимаю документацию, спасибо!

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 что делегировать всю логику макета для обратного вызова

Итак, в конце концов, это действительно зависит от вас. Оба делают одно и то же. Используйте то, что делает его более читабельным для вас

И AnimatedWidget, и animatedBuilder выполняют одинаковую работу, связанную с анимацией.

Прежде чем двигаться дальше, вы должны знать, что для создания анимации нам необходимы как минимум две вещи: 1. Сама анимация и 2. Виджет, к которому мы собираемся применить анимацию.

Ясна разница между тогда:

  • AnimatedWidget принимает только анимацию в качестве параметра, тогда как AnimatedBuilder принимает два аргумента: "дочерний" и "анимация".

  • AnimatedWidget реализован как класс, расширяющий AnimatedWidget. Например

класс abc расширяет AnimatedWidget

В то время как AnimatedBuilder реализован как виджет внутри класса. Например

ребенок: AnimatedBuilder( .....),

Теперь, хотя оба выполняют одну и ту же работу, но у обоих есть разные способы ее выполнения. В AnimatedWidget у него есть собственный дочерний элемент, поэтому нам нужно передать только анимацию. В AnimatedBuilder нам нужно передать и дочерний элемент, и анимацию.

Возьмем, к примеру, AnimatedWidget. Вы можете использовать один и тот же класс AnimatedWidget для любого количества анимаций с разными значениями.

Теперь вы можете подумать, что если AnimatedWidget может делать то, зачем нам AnimatedBuilder?

Ответ прост

Для изменения анимации в AnimatedWidget необходимо изменить виджет, который отображает логотип или наш дочерний элемент. Итак, AnimatedBuilder предоставил возможность явно передать и дочерний элемент по вашему выбору, и анимацию.

Другие вопросы по тегам