void main() {
foo(() {});
foo((_) {});
}
void foo(Function callback) => null;
如何将callback
限制为仅具有VoidCallback
或ValueChanged
。目前,它接受所有类型的Function
。
最佳答案
您不能在编译时将 callback
限制为 VoidCallback
或 ValueChanged
。您可以使用运行时检查:
void foo(Function callback) {
if (callback is! VoidCallback && callback is! ValueChanged) {
throw ArgumentError(
'Only VoidCallback and ValueChanged callbacks are allowed');
}
// ...
}
但是,我不建议这样做,因为它会使您的 API 更难使用。例如,请参阅Future.catchError
它同样尝试接受多种回调类型并在运行时检查它们。不幸的是,它:
- 降低了代码的自记录性,并且文档可能会很尴尬。 (对于
Future
的情况,错误回调文档在Future.then
中令人困惑。) - 将静态类型检查换成运行时检查,这使得错误更难发现。
就您的情况而言,IMO 始终采用 ValueChanged
回调会更简单,并且如果不需要,调用者可以轻松忽略该参数:
void main() {
foo((_) {});
foo((_) => someVoidCallback());
}
void foo<T>(ValueChanged<T> callback) => null;
关于dart - 如何将函数限制为某些参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67672320/