Flutter 从类外管理动画控制器

Dol*_*rma 5 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();
Run Code Online (Sandbox Code Playgroud)

因为我只能管理动画控制器,例如forwardreverse类内部,我尝试将此控制器移动到类外部,就像另一个类一样NotificationBarController,有人可以帮助我如何实现此解决方案吗?

例如

controller = NotificationBarController();
controller.forward();
Run Code Online (Sandbox Code Playgroud)

源代码

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(
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

我疲惫不堪的班级来实施这一点,但这是错误的

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;

}
Run Code Online (Sandbox Code Playgroud)

Mik*_*kin 4

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

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