dart - 如何将函数限制为某些参数?

标签 dart

void main() {
 foo(() {});
 foo((_) {});
}

void foo(Function callback) => null;

如何将callback限制为仅具有VoidCallbackValueChanged。目前,它接受所有类型的Function

最佳答案

您不能在编译时将 callback 限制为 VoidCallbackValueChanged。您可以使用运行时检查:

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/

相关文章:

flutter - AnimatedSwitcher不在小部件之间切换

android - 如何将媒体查询数据添加到特定填充?

dart - 如何在Dart中实现异步/等待

FLutter、AppBar 领先和 Action 边距

json - 使用 JSON 序列化/反序列化 Dart 的新枚举的最佳方法是什么?

dart - 2 个相同的内容数组在 Dart 中不相等?

dart - dart 包是否可以依赖于 bitbucket 托管的私有(private)存储库?

Flutter 测试 find.byValueKey() 对下拉菜单中的项目不起作用

flutter - InkWell 小部件需要 Material 小部件祖先

dart - 将泛型类型参数限制为 int、double 或自定义类