Dart回调-将异步消息传递给父对象

Dart回调-将异步消息传递给父对象,dart,timer,callback,message-passing,Dart,Timer,Callback,Message Passing,我试图通过父类提供的回调函数(ondone)从子类传递数据(bool),该回调函数将在带有布尔参数的周期函数中调用 导入'dart:async'; 类流{ 我的定时器; bool done=false; 功能性激素; 流量(){ ondone=(bool b)=>done=b; } 无效添加计时器(int t){ 定时器=MyTimer(t,ondone); } } 类MyTimer{ 最终整数时间; 剩余整数; 函数回调; 定时器(u定时器),; MyTimer(this.time,this.

我试图通过父类提供的回调函数(ondone)从子类传递数据(bool),该回调函数将在带有布尔参数的周期函数中调用

导入'dart:async';
类流{
我的定时器;
bool done=false;
功能性激素;
流量(){
ondone=(bool b)=>done=b;
}
无效添加计时器(int t){
定时器=MyTimer(t,ondone);
}
}
类MyTimer{
最终整数时间;
剩余整数;
函数回调;
定时器(u定时器),;
MyTimer(this.time,this.callback){
剩余=时间;
}
无效运行(){
_定时器=定时器。周期性(
持续时间(秒:1),
(t) {
剩余--;
如果(剩余==0){
_timer.cancel();
回调(true);
}
});
}
}
但我无法确定回调是否被调用,因为print函数(在main中)没有打印任何封装在if表达式中的内容

void main(){
变量流量=流量();
流量添加定时器(5);
flow.timer.run();
if(flow.done)打印('Timer Finished..);
打印(“我需要在计时器工作时运行”);
}

以命令式方式将数据从子级传递到父级对我(作为初学者)很重要。

调用
flow.timer.run()
调用异步执行的
计时器。您的下一行代码测试
flow.done
立即完成,当然还没有完成。如果您这样做:

  flow.timer.run();
  await Future.delayed(Duration(seconds: 6));
  if (flow.done) print('Timer Finished..');
然后,您的
main
功能将暂停6秒,
计时器将在该时间完成

如果确实要等待延迟,可以按如下方式编写代码:

  Future<void> run() async {
    while (remaining > 0) {
      await Future.delayed(Duration(seconds: 1));
      remaining = remaining - 1;
    }
    callback(true);
  }
编辑:如果要在
main
中运行其他代码,然后等待,可以执行以下操作:

  var future = flow.timer?.run();
  print('Timer is running...');
  await future;
  if (flow.done) print('Timer Finished..');

您的
计时器。周期性的
正在运行
(t)=>剩余--
。因此,
剩余的
将继续变小,而不会发生任何其他情况,因为您没有运行任何其他代码。您正在从
main()
调用
run()
。然后整个执行此方法,包括
if
。因此,您正在创建一个
计时器
,然后立即检查
如果(剩余==0)
,这将是
错误
,因为您将其设置为
5
。感谢您指出。更新了问题。但在剩余==0个hanks之后,如何从main运行print函数。现在工作。有没有更好的方法来实现这一点,而不必担心将来。手动延迟我编辑了答案,以展示如何更改run()。学到的经验教训。我们需要更仔细地考虑异步代码,但是如果我在wait调用之后添加更多代码,wait会阻塞main()函数。有没有不使用线程的方法?我添加了一个示例,在等待之前运行其他代码。
  var future = flow.timer?.run();
  print('Timer is running...');
  await future;
  if (flow.done) print('Timer Finished..');