gpt4 book ai didi

flutter - 聆听 flutter 的变化

转载 作者:行者123 更新时间:2023-12-03 02:38:50 25 4
gpt4 key购买 nike

我正在尝试侦听变量更改以执行一些代码。因此,该变量是一个名为reset的 bool(boolean) 值。动画结束或按下(来自另一个小部件的)按钮后,我想执行一些操作(例如重置动画 Controller )。当动画结束时执行某些操作,因为一旦结束,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
}

我尝试了什么,但似乎没有按预期工作:

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
}

更新:解决方案(上面)实际上正在起作用,我只需要使用类似这样的方法来通知侦听器:

countdown.reset.notifyListeners();
// OR
countdown.reset.value = true;

最佳答案

OP已在评论中得到答案。我只是在这里输入,因此问题已正确标记为已回答。
只需通知侦听器:

countdown.reset.notifyListeners();
// OR
countdown.reset.value = true;
归功于@pskink

关于flutter - 聆听 flutter 的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56421959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com