Что такое неявные анимации (Implicit Animations) в Flutter?

«Что такое неявные анимации (Implicit Animations) в Flutter?» — вопрос из категории Анимации, который задают на 29% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Неявные анимации в Flutter — это готовые виджеты, которые автоматически анимируют переходы при изменении их свойств. Вместо того чтобы вручную управлять анимационными контроллерами, Tween и AnimationBuilder, вы просто меняете значение свойства (например, ширину или цвет), а виджет сам плавно переходит к новому состоянию за заданное время.

Ключевые виджеты неявных анимаций:

  • AnimatedContainer — анимирует изменения размера, цвета, отступов, границ и т.д.
  • AnimatedOpacity — плавно изменяет прозрачность (opacity) дочернего виджета.
  • AnimatedPadding — анимирует изменение padding.
  • AnimatedAlign — анимирует изменение выравнивания дочернего виджета.
  • AnimatedPositioned — используется внутри Stack для анимации изменения позиции.
  • AnimatedDefaultTextStyle — анимирует изменение стиля текста.

Пример: Интерактивный контейнер

bool _isExpanded = false;

GestureDetector(
  onTap: () {
    setState(() {
      _isExpanded = !_isExpanded; // Меняем состояние
    });
  },
  child: AnimatedContainer(
    duration: const Duration(milliseconds: 300), // Длительность анимации
    curve: Curves.easeInOut, // Кривая (характер) анимации
    width: _isExpanded ? 200.0 : 100.0,
    height: _isExpanded ? 200.0 : 100.0,
    color: _isExpanded ? Colors.blueAccent : Colors.orange,
    alignment: Alignment.center,
    child: Text(_isExpanded ? 'Expanded!' : 'Tap me'),
  ),
)

Преимущества:

  • Простота: Не требуется сложного бойлерплейт-кода.
  • Декларативность: Описываете конечное состояние, а Flutter заботится о переходе.

Ограничения:

  • Менее гибкие, чем явные анимации (AnimationController + Tween + AnimatedBuilder).
  • Подходят для прямых переходов между двумя состояниями.

Используйте неявные анимации для быстрого добавления плавных переходов к стандартным виджетам.