Flutter 函数签名

一、函数为什么「必须」要有这个参数?

这是因为传给框架的是一个回调函数,它必须匹配框架预期的「函数签名」。

1
2
3
4
5
TextField(
onChanged: (String value) {
// Flutter 框架:用户每敲一个字,就把输入内容传过来
}
)

onChanged 要求你传一个 (String) => void 的函数,不是你说了算,而是 Flutter SDK 提前定义好的。

所以:

  • 不写参数?语法报错。

  • 写了但不想用?就用 _ 忽略掉。

这是 Dart 类型系统 + Flutter 框架规定的「回调契约」: 你要给我一个函数,我会传参数进来,你怎么处理是你的事。

二、虽然用不到,但框架可能必须传

这就像你开门,门把手肯定会通知门框说“我被转动了”,至于你在门后干嘛、要不要知道门被开,不重要。

框架通知你:“用户输入了!这是新的内容!”

你可以选择用这个内容做各种事(比如验证、更新状态、发请求),也可以暂时什么都不干,只是接收。

这就涉及到一个非常核心的范式设计:“控制反转”(IoC)。

  • 不是你主动拉数据,而是框架“推”给你。

三、有时候你暂时用不到,但未来你可能用到

1
onChanged: (_) {},

是为了让代码不报错、功能不崩,但未来你加个校验就能立刻把 _ 改成 value:

1
2
3
4
5
onChanged: (value) {
if (value.length < 6) {
print("密码太短了");
}
}

所以 Flutter 并不会因为你“暂时用不到”就让你随便写个 onChanged: (){} ——必须匹配签名!

用不用的到参数,是项目业务决定的;但框架必须给你参数,是回调契约决定的.