Лучшее место для создания и хранения анимационных объектов во Флаттере? - PullRequest
0 голосов
/ 03 апреля 2020

Если я хочу определить пользовательский Animation, управляемый из AnimationController, что является лучшим местом для этого?

В случае, если анимация не совпадает с Widget с контроллером, а последний просто передается ему в качестве аргумента, совершенно ясно, что лучшим местом являются final поля класса, так как анимация будет вычислена при создании класса, а не в методе сборки. И есть даже пример кода , подразумевающего это.

Во втором случае мы можем иметь контроллер и управляемую анимацию внутри одного класса. В этом случае мне не ясно, какое место лучше всего инициализировать мои анимации:

  1. Чтобы создать поля класса a и создать их в initState
  2. Или определить их как 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) => //...,
    );
  }

}
...