You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 06:20:30