Dart 回调 - 将异步消息传递给 parent object

Dart callback - passing asynchronous message to parent object

我正在尝试通过回调函数 (ondone[=23] 从 child class 传递数据 (bool) =]) 由 parent class 提供,它将在带有布尔参数的周期函数中调用。

import 'dart:async';

class Flow {
  MyTimer timer;
  bool done = false;
  Function ondone;

  Flow() {
    ondone = (bool b) => done=b;
  }

  void addtimer(int t) {
    timer = MyTimer(t, ondone);
  }

}

class MyTimer {
  final int time;
  int remaining;
  Function callback;
  Timer _timer;

  MyTimer(this.time, this.callback){
    remaining = time;
  }

  void run() {
    _timer = Timer.periodic(
        Duration(seconds: 1), 
        (t) { 
          remaining--;
          if (remaining == 0) {
          _timer.cancel();
          callback(true);
    }
    });
  }
}

但我无法确定是否正在调用回调,因为打印函数(在 main 中)没有打印任何包含在 if 表达式 中的内容。

void main() {
  var flow=Flow();
  flow.addtimer(5);
  flow.timer.run();
  if(flow.done) print('Timer Finished..');
  print('I need to run while timer is working');
}

以命令式的方式将数据从 child 传递到 parent 对我来说很重要(作为初学者)。

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

  flow.timer.run();
  await Future.delayed(Duration(seconds: 6));
  if (flow.done) print('Timer Finished..');

然后您的 main 函数将暂停 6 秒,届时 Timer 将完成。

如果确实要等待延迟,可以这样编码:

  Future<void> run() async {
    while (remaining > 0) {
      await Future.delayed(Duration(seconds: 1));
      remaining = remaining - 1;
    }
    callback(true);
  }

并将其命名为:

  await flow.timer.run();

编辑:如果你想运行其他代码在main然后等待,你可以这样做:

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