Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 倾听颤振中的可变变化_Flutter_Dart - Fatal编程技术网

Flutter 倾听颤振中的可变变化

Flutter 倾听颤振中的可变变化,flutter,dart,Flutter,Dart,我试图通过监听变量更改来执行一些代码。因此,该变量是一个名为reset的bool。我想在动画结束或按下按钮(来自另一个小部件)后执行一些操作(比如重置动画控制器)。当动画结束时执行某项操作就像它结束时一样。AnimationStatus。discommed将是它的状态,并且将调用侦听器。然后,这允许我使用回调函数onCountdownexpire相应地设置变量reset,并根据设置的内容,执行if(widget.reset)块中的一些代码。所以没有必要听这个案子 问题: 但是,假设按下一个按钮(

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

问题:

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

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

代码:

类倒计时扩展了StatefulWidget{
最终失效;终止;
布尔重置;
倒计时(this.onCountdownExpire);
@凌驾
CountdownState createState()=>CountdownState();
}
类CountdownState使用TickerProviderStateMixin扩展状态{
动画控制器;
字符串获取timerString{
持续时间=controller.Duration*controller.value;
返回“${duration.inMinutes}:${(duration.inSeconds%60).toString()}”;
}
@凌驾
void initState(){
super.initState();
控制器=动画控制器(
vsync:这个,,
持续时间:持续时间(秒数:2),
)…addStatusListener((动画状态){
如果(状态==AnimationStatus.discomered){
debugPrint(“Animation.disposed”);
onCountdownExpire();
if(widget.reset){
widget.reset=false;
控制器。反向(从:1.0);
} 
}
});
控制器。反向(从:1.0);
}
…//省略的代码
}
我已经尝试过,但似乎没有达到预期效果:

类倒计时扩展了StatefulWidget{
最终失效;终止;
倒计时(this.onCountdownExpire);
ValueNotifier重置=ValueNotifier(假);
@凌驾
CountdownState createState()=>CountdownState();
}
类CountdownState使用TickerProviderStateMixin扩展状态{
动画控制器;
@凌驾
void initState(){
widget.reset.addListener((){
debugPrint(“值通知程序为true”);
控制器。反向(从:1.0);
});
super.initState();
控制器=动画控制器(
vsync:这个,,
持续时间:持续时间(秒数:2),
)…addStatusListener((动画状态){
如果(状态==AnimationStatus.discomered){
debugPrint(“Animation.disposed”);
onCountdownExpire();
}
});
控制器。反向(从:1.0);
}
…//省略的代码
}
更新:解决方案(如上)实际上是可行的,我只需要使用类似这样的方法来通知听众:

countdown.reset.notifyListeners();
//或
countdown.reset.value=true;
OP已经在评论中得到了答案。我只是在这里输入,这样问题就正确地标记为已回答

只需通知听众:

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

归功于@pskink

使用
ValueNotifier::addListener
method@pskink好的,嗨,我试过了,但它似乎没有按预期工作(更新后)。我是否正确地实现了它?@pskink ok nvm我错误地调用了它,我必须使用类似于
countdown.reset.notifyListeners()的东西。谢谢你的帮助!发布您的答案,我会接受:)不,您不需要
notifyListeners
-如果调用
countdown.reset=…
方法
notifyListeners
将自动调用-请参阅
ValueNotifier
文档:“当
value
被替换为与相等运算符==计算的旧值不相等的值时,此类将通知其侦听器。”抱歉,我的意思是
countdown.reset.value=…