如何向用户询问回调函数
How to ask user for a callback function
我想向用户询问回调函数(缩写):
Future<dynamic> myfunc(dynamic onSuccess) async {
Completer c = Completer();
// some time-consuming procedure
if (onSuccess is Function) {
c.complete(true);
return c.future.then(onSuccess());
} else {
c.complete(false);
return c.future;
}
}
bool should_be_true = await myfunc(print("Success!"))
但是我的代码不起作用,dartanalyzer 在最后一行抛出以下错误:
error • The expression here has a type of 'void', and therefore cannot be used at example/index.dart:15:35 • use_of_void_result
一些评论:
- 您传递的是调用
print
的 结果 ,而不是函数。使用() => print('...')
传入一个函数。
- 在 return
Future
的函数中,您希望 return 尽快完成,这样您就不会阻止呼叫者。这就是我使用 scehduleMicrotask
的原因。一般来说,你不需要使用 Completer
,除了非常复杂的异步工作。尝试只使用 async/await.
- 您不需要使用带有
async
的 Completer
标记函数。
试试这个:
import 'dart:async';
Future<dynamic> myfunc(dynamic onSuccess) {
var c = Completer();
scheduleMicrotask(() {
// some time-consuming procedure
if (onSuccess is Function) {
onSuccess();
c.complete(true);
} else {
c.complete(false);
}
});
return c.future;
}
main() async {
var should_be_true = await myfunc(() => print("Success!"));
}
我想向用户询问回调函数(缩写):
Future<dynamic> myfunc(dynamic onSuccess) async {
Completer c = Completer();
// some time-consuming procedure
if (onSuccess is Function) {
c.complete(true);
return c.future.then(onSuccess());
} else {
c.complete(false);
return c.future;
}
}
bool should_be_true = await myfunc(print("Success!"))
但是我的代码不起作用,dartanalyzer 在最后一行抛出以下错误:
error • The expression here has a type of 'void', and therefore cannot be used at example/index.dart:15:35 • use_of_void_result
一些评论:
- 您传递的是调用
print
的 结果 ,而不是函数。使用() => print('...')
传入一个函数。 - 在 return
Future
的函数中,您希望 return 尽快完成,这样您就不会阻止呼叫者。这就是我使用scehduleMicrotask
的原因。一般来说,你不需要使用Completer
,除了非常复杂的异步工作。尝试只使用 async/await. - 您不需要使用带有
async
的Completer
标记函数。
试试这个:
import 'dart:async';
Future<dynamic> myfunc(dynamic onSuccess) {
var c = Completer();
scheduleMicrotask(() {
// some time-consuming procedure
if (onSuccess is Function) {
onSuccess();
c.complete(true);
} else {
c.complete(false);
}
});
return c.future;
}
main() async {
var should_be_true = await myfunc(() => print("Success!"));
}