一种骇人听闻的方法是使用fn.runtimeType.toString().endsWith('=> void').
由于您似乎知道它fn恰好需要两个位置参数,因此更好的方法是创建functionHandler一个泛型函数,Function使用参数化类型完全限定您的类型,然后检查返回类型的类型参数:
dynamic functionHandler<ReturnType, ArgumentType1, ArgumentType2>(
ReturnType Function(ArgumentType1, ArgumentType2) fn,
List<dynamic> args,
) {
// `ReturnType == void` is a syntax error, so we must do a little
// dance to get its corresponding `Type` object.
Type getType<T>() => T;
if (ReturnType == getType<void>()) {
print('void');
} else {
print('non-void');
}
}
void main() {
// Test a `void` function.
void voidFunction(Object arg1, dynamic arg2) {}
functionHandler(voidFunction, []); // Prints: void
// Test a function that returns `null`.
Null nullFunction(int arg1, String? arg2) => null;
functionHandler(nullFunction, []); // Prints: non-void
// Test a function with optional arguments.
int intFunction(int arg1, [int? arg2, int? arg3]) => 0;
functionHandler(intFunction, []); // Prints: non-void
}