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 предоставил возможность явно передать и дочерний элемент по вашему выбору, и анимацию.