Flutter从课外管理动画控制器

时间:2019-07-07 16:22:48

标签: flutter flutter-animation

这是我在课堂上使用的简单动画

controller = AnimationController(vsync: this, duration: Duration(milliseconds: 200));

offset = Tween<Offset>(begin: Offset.zero, end: Offset(0.0, -1.0)).animate(controller);
controller.forward();

因为我只能在班级内部管理forwardreverse之类的动画控制器,而我尝试将此控制器移至班级外部,就像另一个班级为NotificationBarController一样任何人都可以帮助我实现该解决方案吗?

例如

controller = NotificationBarController();
controller.forward();

源代码

class NotificationBar extends StatefulWidget {
  final Widget contentWidget;
  final Widget barWidget;

  NotificationBar({@required this.contentWidget, @required this.barWidget});

  @override
  State<StatefulWidget> createState() => NotificationBarState();
}

class NotificationBarState extends State<NotificationBar>  with SingleTickerProviderStateMixin {
  AnimationController controller;
  Animation<Offset> offset;

  @override
  void initState() {
    super.initState();

    controller = AnimationController(vsync: this, duration: Duration(milliseconds: 200));
    // offset = Tween<Offset>(begin: Offset.zero, end: Offset(1.0, 0.0)).animate(controller); from right
    offset = Tween<Offset>(begin: Offset.zero, end: Offset(0.0, -1.0)).animate(controller);
    controller.forward();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(
      ),
    );
  }
}

我上课很累,但是这是错误的

class NotificationBarController  extends ChangeNotifier {
  NotificationBarController({@required TickerProvider vsync}): _animationController = AnimationController(vsync: vsync);

  Animation<double> get animation => _animationController?.view ?? kAlwaysCompleteAnimation;

  Animation<double> get state => _animationController?.view ?? kAlwaysCompleteAnimation;

}

1 个答案:

答案 0 :(得分:2)

您可以使用GlobalKey。 首先,您需要像这样实例化并存储它 final key = GlobalKey<NotificationBarState>(),然后需要将其传递给NotificationBar构造函数,并使用密钥调用super。然后,您可以通过调用key.currentState.someMethod()来访问该州及其成员。

但是,对于我来说,整个想法并不像 Flutter方式。我建议在NotificationBarState内订阅一些流或changeNotifier并触发动画作为对新事件或通知的反应