Dart中如何限制函数的回调参数仅为VoidCallback或ValueChanged
Dart 3.0及以上版本(推荐方案)
利用Dart 3新增的联合类型语法,可以直接在编译期就限制参数类型,不符合的代码会直接报编译错误:
import 'package:flutter/foundation.dart'; void main() { foo(() {}); // VoidCallback类型,调用合法 foo((int value) {}); // ValueChanged<int>类型,调用合法 // foo((a, b) {}); // 多参数函数,编译阶段直接报错 } // 用|限定参数只能是两种函数类型的其中一种 void foo(VoidCallback | ValueChanged callback) => null;
如果需要限定ValueChanged的参数类型,可以进一步指定泛型,比如ValueChanged<int>就只能接受入参为int的单参数回调。
Dart 3.0以下版本
低版本Dart不支持联合类型,你可以在函数内部增加运行时校验,调试阶段可以通过断言快速发现不符合要求的入参:
import 'package:flutter/foundation.dart'; void main() { foo(() {}); // 合法 foo((String content) {}); // 合法 // foo((p1, p2) => print('$p1 $p2')); // 调试模式下会触发断言提示 } void foo(Function callback) { // 类型校验 assert( callback is VoidCallback || callback is ValueChanged, 'callback仅支持VoidCallback和ValueChanged两种类型', ); // 业务逻辑示例:根据不同类型调用回调 if (callback is VoidCallback) { callback(); } else if (callback is ValueChanged) { callback('测试参数'); } }
内容的提问来源于stack exchange,提问作者iDecode
相关产品推荐
相关产品推荐

