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..');
我正在尝试通过回调函数 (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..');