聆听颤动的可变变化

Raj*_*eep 21 dart flutter

我正在尝试侦听变量更改以执行一些代码。所以变量是一个名为reset. 一旦动画结束或按下按钮(来自另一个小部件),我想执行一些操作(比如重置动画控制器)。在动画结束时执行某事,因为一旦结束AnimationStatus.dismissed将成为它的状态,并且将调用侦听器。然后,这允许我使用回调函数onCountdownexpire来相应地设置变量reset,并根据设置的内容执行if(widget.reset)块中的一些代码。所以没有必要听这个案子。

问题:

但是,假设按下了一个按钮(在另一个小部件中)并且我将变量设置reset为 true。我希望动画停止并重置。我现在不能依赖AnimationStatus监听器,因为它只状态改变执行。我希望它在其状态期间重置。所以我必须以某种方式听变量widget.reset

我对此进行了一些研究,并发现这ValueNotifier可能是一种方法,但关于如何使用它的示例并不多。比如我怎么去听它?

代码:

class Countdown extends StatefulWidget {

  final VoidCallback onCountdownExpire;
  bool reset;
  Countdown(this.onCountdownExpire);

  @override
  CountdownState createState() => CountdownState();
}

class CountdownState extends State<Countdown> with TickerProviderStateMixin {
  AnimationController controller;

  String get timerString {
    Duration duration = controller.duration * controller.value;
    return '${duration.inMinutes}:${(duration.inSeconds % 60).toString()}';
  }

  @override
  void initState() {
    super.initState();
    controller = AnimationController(
      vsync: this,
      duration: Duration(seconds: 2),
    )..addStatusListener((AnimationStatus status){
        if (status == AnimationStatus.dismissed) {
          debugPrint("Animation.dismissed");
          widget.onCountdownExpire();
          if (widget.reset) {
            widget.reset = false;
            controller.reverse(from: 1.0);
          } 
        }
    });
    controller.reverse(from: 1.0);
  }
  ... // omitted code
}
Run Code Online (Sandbox Code Playgroud)

我尝试过但似乎没有按预期工作:

class Countdown extends StatefulWidget {

  final VoidCallback onCountdownExpire;
  Countdown(this.onCountdownExpire);
  ValueNotifier reset = ValueNotifier(false);

  @override
  CountdownState createState() => CountdownState();
}

class CountdownState extends State<Countdown> with TickerProviderStateMixin {
  AnimationController controller;

  @override
  void initState() {

    widget.reset.addListener(() {
      debugPrint("value notifier is true");
      controller.reverse(from: 1.0);
    });

    super.initState();

    controller = AnimationController(
      vsync: this,
      duration: Duration(seconds: 2),
    )..addStatusListener((AnimationStatus status){
        if (status == AnimationStatus.dismissed) {
          debugPrint("Animation.dismissed");
          widget.onCountdownExpire();
        }
    });
    controller.reverse(from: 1.0);
  }
  ... // omitted code
}
Run Code Online (Sandbox Code Playgroud)

更新:解决方案(上面)实际上是有效的,我只需要使用这样的东西来通知侦听器:

countdown.reset.notifyListeners();
// OR
countdown.reset.value = true;  
Run Code Online (Sandbox Code Playgroud)

amb*_*s58 14

OP 已经在评论中得到了答案。我只是在此处输入,以便将问题正确标记为已回答。

只需通知听众:

countdown.reset.notifyListeners();
// OR
countdown.reset.value = true;
Run Code Online (Sandbox Code Playgroud)

归功于@pskink