Dart回调方法未执行及相关技术问题咨询
问题1:使用Lambda表达式传入回调时,fIn()未执行的原因
你写的Lambda表达式() => secondMethodCallback并没有执行secondMethodCallback,而是返回了这个函数对象本身。当firstMethod里调用fIn()时,实际只是执行了这个Lambda,得到secondMethodCallback函数,但没有触发它的执行。
错误写法:
firstMethod(counter, () => secondMethodCallback);
正确写法应该让Lambda执行secondMethodCallback,有两种方式:
// 方式1:显式调用函数 firstMethod(counter, () => secondMethodCallback()); // 方式2:用大括号包裹执行逻辑 firstMethod(counter, () { secondMethodCallback(); });
而直接传入secondMethodCallback时,相当于把函数本身作为参数传递,fIn()就是直接调用这个函数,所以能正常执行。
问题2:Function和Function()作为参数声明的区别
两者本质有区别,但你觉得没区别是因为传入的都是无参无返回值的函数:
Function是泛指所有函数类型,可以接受任意参数列表、任意返回值的函数,类型检查更宽松。Function()是明确指定无参数、无返回值的函数类型,类型检查更严格,只能传入符合该签名的函数。
如果传入带参数的函数,用Function不会报错,用Function()则会触发类型错误。建议优先用明确的函数类型(比如Function()),避免类型不匹配的隐患。
问题3:能否在firstMethod内部修改counter变量
不能直接修改。counter是main函数的局部变量,firstMethod没有直接访问该变量的权限。
但可以通过回调函数间接修改:因为secondMethodCallback是闭包,它捕获了main作用域里的counter,所以在firstMethod里调用fIn()时,会触发secondMethodCallback执行,从而修改counter。
问题4:当fIn在firstMethod内部执行时,能否修改intIn变量
不能。int是Dart的值类型,intIn是firstMethod的参数,它是counter的一个副本,修改intIn只会改变这个副本的值,不会影响main里的原始counter。
另外,fIn(即secondMethodCallback)捕获的是main作用域的counter,和firstMethod里的intIn没有关联,所以执行fIn()也不会对intIn产生影响。
内容的提问来源于stack exchange,提问作者Rasputin221

