AnimationController: Можем ли мы передать vsync TickerProvider другому классу? - PullRequest
1 голос
/ 08 октября 2019

Я разрабатываю приложение во Flutter с множеством разнообразных анимаций. Я хотел бы структурировать мой код, разделяя представления, логику (модель BLoC) и АНИМАЦИИ. Для этой проблемы я пытаюсь несколько раз объявить одну и ту же анимацию для кнопок в другом классе моего StatefulWidget.

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

Класс анимации конструктора

AppBloc(TickerProvider tickerProvider) {
    banimationController = AnimationController(
      vsync: tickerProvider,
      duration: Duration(milliseconds: 100),
      lowerBound: 0,
      upperBound: 0.05,
    );
}

Декларация

AppBloc(this);

Я знаю, что это, вероятно,не правильно, я написал этот код, чтобы проиллюстрировать свою проблему.

Я просто хочу разделить объявления анимации в другом файле.

1 Ответ

2 голосов
/ 08 октября 2019

TickerProvider - это миксин. Вы можете использовать несколько миксов в классе, используя с ключевым словом . Лучший способ использовать mixin uff TickerProvider - использовать его с с ключевым словом .

Пример:

  class _HomeState extends State<Home> with TickerProviderStateMixin {
  Animation<double> _animation;
  AnimationController _animationController;

  GoogleSignIn _googleSignIn;
  GoogleSignInAccount _googleSignInAccount;
  GoogleSignInAuthentication _googleSignInAuthentication;
  FirebaseAuth _auth;

 // FacebookLoginResult _facebookLoginResult;
  // FacebookLogin _facebookLogin;
   // FirebaseUser facebookUser;

  @override
  void initState() {
    super.initState();
    _animationController =
        AnimationController(vsync: this, duration: Duration(seconds: 4));
    _animation = Tween<double>(begin: -1.0, end: 0.0).animate(CurvedAnimation(
        parent: _animationController, curve: Curves.fastOutSlowIn));

    _animationController.forward();
  }

  @override
  void dispose() {
    _animationController.dispose();
    super.dispose();
  }

 @override
  Widget build(BuildContext context) {
return widget();
}
}

Если вы используете TickelProvider таким образом, вы можете просто передать this в качестве значения для vsync.

...