Flutter中如何通过引用传递函数?能否按引用而非按值调用函数?
在Flutter(Dart)里实现函数相关的引用传递
首先得明确:Dart里所有参数都是按值传递的,但对于引用类型(比如函数、对象、列表这些),传递的是对象引用的副本——这听起来绕,但实际效果和“引用传递”很像,下面分两种场景说明:
1. 把函数作为引用传递给其他函数
Dart里函数是一等公民,本身就是引用类型,直接传递函数变量就行,本质就是传递它的引用:
举个例子:
// 定义一个普通函数 void printMsg(String content) { print(content); } // 接收函数引用的函数 void runFunction(Function(String) targetFunc) { targetFunc("通过函数引用调用的消息!"); } void main() { // 直接传函数名,就是传递引用 runFunction(printMsg); }
这里printMsg作为参数传给runFunction,调用的就是原函数的引用,完全符合“引用传递函数”的需求。
2. 让函数能修改外部变量(模拟参数的引用传递)
Dart没有像C++那种&直接传引用的语法,但可以用两种方式模拟:
方法一:用可变对象包装值
把要修改的基本类型(int、double这些)放进列表、Map或者自定义的可变类里,因为对象是引用类型,函数内部修改对象的属性会同步到外部:
列表包装的例子:
void changeValue(List<int> wrapper) { wrapper[0] = 100; // 修改列表里的值,外部能拿到变化 } void main() { var numWrapper = [10]; changeValue(numWrapper); print(numWrapper[0]); // 输出 100 }
自定义包装类更清晰:
class Holder<T> { T value; Holder(this.value); } void updateHolder(Holder<int> holder) { holder.value = 200; } void main() { var numHolder = Holder(50); updateHolder(numHolder); print(numHolder.value); // 输出 200 }
方法二:用闭包回调
如果不想搞包装类,直接用闭包让函数内部修改外部变量:
void modifyNum(void Function(int) update) { update(300); } void main() { var myNum = 100; modifyNum((newVal) { myNum = newVal; // 闭包直接访问并修改外部变量 }); print(myNum); // 输出 300 }
关键提醒
- Dart里没有真正意义上的“按引用传递参数”语法,所有参数都是按值传,但引用类型的参数传的是引用副本,所以改对象内部状态会影响外部;如果是String、int这种不可变类型,直接改参数变量不会影响外部,必须用上面的包装或闭包方法。
- 函数本身作为引用类型,传递函数变量时,就是传递它的引用——你可以在其他函数里调用这个引用,但如果在函数内部给参数重新赋值(比如
targetFunc = anotherFunc),不会影响外部的原函数变量。
内容的提问来源于stack exchange,提问作者Ashu Upadhyay
相关产品推荐
相关产品推荐

