Если я хочу определить пользовательский Animation
, управляемый из AnimationController
, что является лучшим местом для этого?
В случае, если анимация не совпадает с Widget
с контроллером, а последний просто передается ему в качестве аргумента, совершенно ясно, что лучшим местом являются final
поля класса, так как анимация будет вычислена при создании класса, а не в методе сборки. И есть даже пример кода , подразумевающего это.
Во втором случае мы можем иметь контроллер и управляемую анимацию внутри одного класса. В этом случае мне не ясно, какое место лучше всего инициализировать мои анимации:
- Чтобы создать поля класса a и создать их в
initState
- Или определить их как
final
локальные переменные в build
методе
Есть ли реальная разница в производительности между этими опциями?
См. примеры кода ниже:
# 1
class _AState extends State<A> with SingleTickerProviderStateMixin {
AnimationController _controller;
Animation<Color> _animation;
@override
void initState() {
super.initState();
_controller = AnimationController(vsync: this, duration: const Duration(milliseconds: 300));
_animation = ColorTween(begin: Colors.black, end: Colors.white).animate(_controller);
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return AnimatedBuilder(
animation: _animation,
builder: (BuildContext context, Widget child) => //...,
);
}
}
# 2
class _BState extends State<B> with SingleTickerProviderStateMixin {
AnimationController _controller;
@override
void initState() {
super.initState();
_controller = AnimationController(vsync: this, duration:const Duration(milliseconds: 300));
}
@override
void dispose(){
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
final Animation<Color> animation = ColorTween(begin: Colors.black, end: Colors.white).animate(_controller);
return AnimatedBuilder(
animation: animation,
builder: (BuildContext context, Widget child) => //...,
);
}
}