如何在不传递参数的情况下调用 Flutter 中的 void 函数?
How can you call a void function in Flutter without passing a parameter?
我是 Flutter 的新手,正在学习 Udacity 的入门课程。在其中一项任务中,我试图遵循代码,但我无法理解它。这是项目解决方案的代码(我已经剪切并粘贴了重要的部分,以及法律免责声明我不拥有任何此代码,它来自示例 Flutter Udacity 项目):
Widget build(BuildContext context) {
final input = Padding(
padding: _padding,
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
TextField(...),
_createDropdown(_fromValue.name, _updateFromConversion),
],
),
);
}
void _updateFromConversion(dynamic unitName) {
setState(() {
_fromValue = _getUnit(unitName);
});
if (_inputValue != null) {
_updateConversion();
}
}
Widget _createDropdown(String currentValue, ValueChanged<dynamic> onChanged) {
return Container(
margin: EdgeInsets.only(top: 16.0),
decoration: BoxDecoration(...),
padding: EdgeInsets.symmetric(vertical: 8.0),
child: Theme(...),
child: DropdownButtonHideUnderline(
child: ButtonTheme(
alignedDropdown: true,
child: DropdownButton(
value: currentValue,
items: _unitMenuItems,
onChanged: onChanged,
style: Theme.of(context).textTheme.title,
),
),
),
),
);
}
这就是我卡住的地方。 _updateFromConversion 需要输入参数 unitName。但是当他们调用它时,在 _createDropdown 中,他们没有传递任何内容。那么 _updateFromConversion 如何知道 unitName 是什么?另外,_updateFromConversion是在_createDropdown之前执行,还是在设置DropdownButton的"onChanged"属性时执行?
第二个问题:他们正在将 return 类型为 void 的函数传递给 _createDropdown,这需要 ValueChanged。这不应该引发错误吗?
如果有人能解释这段代码的流程以及我遗漏了什么,我将不胜感激。
谢谢!
亚什温,
在 dart 函数中可以作为参数传递给其他函数。例如,这通常用于传递回调。
在您提供的示例中,函数 _updateFromConversion 作为参数 onChanged 传递给另一个函数 _createDropdown。
在该函数中,它将被分配给 DropdownButton 按钮的 onChanged 侦听器。
每次 DropdownButton 的值发生变化时,都会调用此函数并将其传递给 DropdownButton 的选定值。
您似乎误解了为函数调用将变量赋值给函数。
让我试着用示例代码来展示它。
void _updateFromConversion(dynamic unitName) {
print("Unit name: $unitName");
}
class SomeClass {
void Function(dynamic arg) myFunction;
}
void main() {
final c = SomeClass()..myFunction = _updateFromConversion;
print("Created c. Calling its function");
c.myFunction("foo");
print("Done");
}
当你运行这段代码时,你会看到这样的打印:
Created c. Calling its function
Unit name: foo
Done
这表明在 SomeClass()..myFunction = _updateFromConversion;
中创建 SomeClass
实例时未调用 _updateFromConversion
函数。这只是一个赋值(它给字段 myFunction
赋值 _updateFromConversion
...是的,在 Dart 中函数本身可以是一个值)!
你应该知道,因为函数名后面没有()
,Dart中的函数调用总是必须包含()
之间的参数列表,即使它是空的。
所以,这里是调用函数的地方:
c.myFunction("foo");
看到了吗?有一个包含单个值 "foo"
的参数列表。这就是函数然后打印 Unit name: foo
的原因,因为参数 unitName
取值 "foo"
.
TL;DR
这是一个函数调用:
c.myFunction("foo");
这不是:
c.myFunction;
我是 Flutter 的新手,正在学习 Udacity 的入门课程。在其中一项任务中,我试图遵循代码,但我无法理解它。这是项目解决方案的代码(我已经剪切并粘贴了重要的部分,以及法律免责声明我不拥有任何此代码,它来自示例 Flutter Udacity 项目):
Widget build(BuildContext context) {
final input = Padding(
padding: _padding,
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
TextField(...),
_createDropdown(_fromValue.name, _updateFromConversion),
],
),
);
}
void _updateFromConversion(dynamic unitName) {
setState(() {
_fromValue = _getUnit(unitName);
});
if (_inputValue != null) {
_updateConversion();
}
}
Widget _createDropdown(String currentValue, ValueChanged<dynamic> onChanged) {
return Container(
margin: EdgeInsets.only(top: 16.0),
decoration: BoxDecoration(...),
padding: EdgeInsets.symmetric(vertical: 8.0),
child: Theme(...),
child: DropdownButtonHideUnderline(
child: ButtonTheme(
alignedDropdown: true,
child: DropdownButton(
value: currentValue,
items: _unitMenuItems,
onChanged: onChanged,
style: Theme.of(context).textTheme.title,
),
),
),
),
);
}
这就是我卡住的地方。 _updateFromConversion 需要输入参数 unitName。但是当他们调用它时,在 _createDropdown 中,他们没有传递任何内容。那么 _updateFromConversion 如何知道 unitName 是什么?另外,_updateFromConversion是在_createDropdown之前执行,还是在设置DropdownButton的"onChanged"属性时执行?
第二个问题:他们正在将 return 类型为 void 的函数传递给 _createDropdown,这需要 ValueChanged。这不应该引发错误吗?
如果有人能解释这段代码的流程以及我遗漏了什么,我将不胜感激。 谢谢!
亚什温,
在 dart 函数中可以作为参数传递给其他函数。例如,这通常用于传递回调。
在您提供的示例中,函数 _updateFromConversion 作为参数 onChanged 传递给另一个函数 _createDropdown。
在该函数中,它将被分配给 DropdownButton 按钮的 onChanged 侦听器。
每次 DropdownButton 的值发生变化时,都会调用此函数并将其传递给 DropdownButton 的选定值。
您似乎误解了为函数调用将变量赋值给函数。
让我试着用示例代码来展示它。
void _updateFromConversion(dynamic unitName) {
print("Unit name: $unitName");
}
class SomeClass {
void Function(dynamic arg) myFunction;
}
void main() {
final c = SomeClass()..myFunction = _updateFromConversion;
print("Created c. Calling its function");
c.myFunction("foo");
print("Done");
}
当你运行这段代码时,你会看到这样的打印:
Created c. Calling its function
Unit name: foo
Done
这表明在 SomeClass()..myFunction = _updateFromConversion;
中创建 SomeClass
实例时未调用 _updateFromConversion
函数。这只是一个赋值(它给字段 myFunction
赋值 _updateFromConversion
...是的,在 Dart 中函数本身可以是一个值)!
你应该知道,因为函数名后面没有()
,Dart中的函数调用总是必须包含()
之间的参数列表,即使它是空的。
所以,这里是调用函数的地方:
c.myFunction("foo");
看到了吗?有一个包含单个值 "foo"
的参数列表。这就是函数然后打印 Unit name: foo
的原因,因为参数 unitName
取值 "foo"
.
TL;DR
这是一个函数调用:
c.myFunction("foo");
这不是:
c.myFunction;