Представь: ты создаешь Flutter-приложение и хочешь сделать переход между экранами эффектным. Что же выбрать?
💡Конечно, Hero
Как и положено настоящему герою, Hero анимирует элементы при смене экранов, плавно изменяя их размер и положение.
Что умеет Hero?
✅Улучшать восприятие интерфейса
✅Сохранять контекст перехода
✅Создавать красивые анимации
Например, можно сделать так, чтобы изображение плавно увеличивалось при переходе на новый экран или кнопка перемещалась между экранами.
Как это работает?
Hero связывает элементы с помощью уникального тега и автоматически анимирует их переход.
Давайте разберемся на примере:
📌Первый экран
Оборачиваем изображение в Hero и задаем тег:
GestureDetector(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => SecondScreen(imageUrl: ‘some_image_url’),
),
);
},
child: Hero(
tag: 'image',
child: Image.network(image, height: 200),
),
);
📌Второй экран
Используем тот же тег:
Hero(
tag: 'image',
Child: Image.network(imageUrl, width: 300),
);
Hero автоматически выполняет анимацию — никаких сложных настроек.
Параметры Hero:
tag — уникальный идентификатор элемента
child — сам анимируемый виджет (изображение, кнопка и другие элементы)
flightShuttleBuilder — позволяет кастомизировать анимацию
placeholderBuilder — задает виджет-заполнитель до завершения анимации
transitionOnUserGestures — разрешает запуск анимации по жесту пользователяГде еще можно использовать Hero?
🔴В анимации текста
🔴Для перемещения кнопок
🔴Чтобы создавать эффектные переходы между карточками
Полезные советы:
➡️Используйте уникальные теги — каждый Hero должен иметь уникальный тег
➡️Комбинируйте с анимациями — FadeTransition, AnimatedContainer и другими
➡️Роутинг: без правильного маршрута даже Hero не взлетит — выбирайте переходы с анимацией
➡️Не перегружайте интерфейс — анимируйте только ключевые элементы
👍 Лайфхак: можно настроить анимацию вручную через
heroFlightShuttleBuilder или управлять временем анимации с помощью HeroController.Теперь Hero не только в твоем коде, но и в тебе — ты создал крутой переход!