Можете объяснить, что такое AnimationController и как он используется в Flutter для управлением анимациями?
Ответ от нейросети
sobes.tech AI
Что хотят услышать интервьюеры:
AnimationController — это объект, который задаёт время жизни анимации и управляет её прогрессом. Он позволяет запускать, останавливать, повторять и направлять анимацию. Обычно он используется вместе с TickerProvider и Animation для построения анимаций в Flutter.
Определение:
AnimationController — это контроллер, который генерирует значения анимации во времени. По сути, он хранит текущее значение между lowerBound и upperBound и изменяет его с заданной длительностью duration. Контроллер сам по себе не рисует анимацию, а только управляет её ходом; отображение делается через AnimatedBuilder, AnimationBuilder, FadeTransition, ScaleTransition и другие виджеты/анимации.
Пример использования:
Частый сценарий — анимация появления кнопки: элемент плавно увеличивается от 0 до 1 при открытии экрана.
import 'package:flutter/material.dart';
class MyAnimatedWidget extends StatefulWidget {
const MyAnimatedWidget({super.key});
@override
State<MyAnimatedWidget> createState() => _MyAnimatedWidgetState();
}
class _MyAnimatedWidgetState extends State<MyAnimatedWidget>
with SingleTickerProviderStateMixin {
late final AnimationController _controller;
late final Animation<double> _animation;
@override
void initState() {
super.initState();
_controller = AnimationController(
vsync: this,
duration: const Duration(milliseconds: 600),
);
_animation = CurvedAnimation(
parent: _controller,
curve: Curves.easeOut,
);
_controller.forward();
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return ScaleTransition(
scale: _animation,
child: ElevatedButton(
onPressed: () {},
child: const Text('Animate'),
),
);
}
}
Пояснение кода:
SingleTickerProviderStateMixinнужен как источникvsync, чтобы анимация обновлялась синхронно с кадрами экрана и не тратила ресурсы в фоне.AnimationControllerсоздаётся вinitState()и получаетduration— за какое время должна пройти анимация.CurvedAnimationдобавляет кривую изменения, чтобы анимация выглядела естественнее, чем линейное изменение.forward()запускает анимацию от начала к концу.ScaleTransitionподписан на значение анимации и масштабирует кнопку автоматически.dispose()обязателен, чтобы освободить ресурсы контроллера после удаления виджета.
Ключевые моменты:
AnimationControllerуправляет временем и состоянием анимации, но не отвечает за отрисовку.- Для создания контроллера почти всегда нужен
vsyncчерезTickerProvider. - Контроллер надо создавать в
initState()и обязательно освобождать вdispose(). - Он умеет запускать анимацию в обе стороны:
forward(),reverse(), а такжеrepeat(),stop(). - Обычно контроллер используется вместе с
AnimatedBuilder,CurvedAnimation,FadeTransition,ScaleTransitionи подобными механизмами.