我正在尝试侦听变量更改以执行一些代码。所以变量是一个名为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
| 归档时间: |
|
| 查看次数: |
24152 次 |
| 最近记录: |