能否向VoidCallback传递带参数的函数?附代码示例
能不能给VoidCallback传递带参数的函数?
嘿,这个问题戳中了很多刚接触Dart回调的开发者的痛点!直接给你答案:不行,不能直接把带参数的函数传给VoidCallback——因为VoidCallback是Dart预定义的类型别名,它的核心定义是:
typedef VoidCallback = void Function();
简单说,它要求对应的函数必须是没有参数、没有返回值的。你代码里写的final VoidCallback callback(int);本身就是语法错误,因为VoidCallback不支持带参数的声明方式。
那该怎么实现你想要的“让MyOtherClass能调用带int参数的doSomething”呢?这里有两种常用的正确写法:
方法1:自定义带参数的回调类型
先定义一个符合你需求的回调类型,再用它来声明变量:
// 自定义接受int参数、无返回值的回调类型 typedef IntCallback = void Function(int); class MyClass { void doSomething(int i) { print("收到参数:$i"); } // 直接把doSomething传给MyOtherClass,类型匹配 MyOtherClass myOtherClass = MyOtherClass(doSomething); } class MyOtherClass { final IntCallback callback; MyOtherClass(this.callback); void triggerCallback() { callback(5); // 这里可以正常传递int参数调用 } }
方法2:直接使用函数类型声明
如果不想单独定义typedef,也可以直接在类里用void Function(int)作为类型:
class MyClass { void doSomething(int i) { print("收到参数:$i"); } MyOtherClass myOtherClass = MyOtherClass(doSomething); } class MyOtherClass { // 直接声明接受int参数的函数类型 final void Function(int) callback; MyOtherClass(this.callback); void triggerCallback() { callback(5); } }
额外场景:把带参函数适配成VoidCallback
如果遇到某个API只接受VoidCallback,但你又需要传递参数调用函数,那可以用闭包来包裹:
// 假设这个函数只接受VoidCallback void runVoidCallback(VoidCallback callback) { callback(); } void main() { void myFunction(int num) => print("数字是:$num"); // 用闭包把参数“固定”住,适配成VoidCallback runVoidCallback(() => myFunction(10)); }
这样就能完美实现你想要的逻辑啦!
内容的提问来源于stack exchange,提问作者Tobias Gubo
相关产品推荐
相关产品推荐

