我是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”属性时执行?
第二个问题:他们正在将返回类型为void的函数传递给_createDropdown,该函数期望ValueChanged。这不应该引发错误吗?
如果有人可以解释这段代码的流程以及我所缺少的内容,我将不胜感激。 谢谢!
答案 0 :(得分:0)
Yashvin,
在dart中,功能可以作为参数传递给其他功能。例如,通常用于传递回调。
在您提供的示例中,函数_updateFromConversion作为参数onChanged传递给另一个函数_createDropdown。
在该函数中,它将分配给DropdownButton按钮的onChanged侦听器。
DropdownButton的每个时间值都会更改,此函数将被调用并传递所选的DropdownButton值。
答案 1 :(得分:0)
您似乎误解了为函数调用将变量分配给函数的方法。
让我尝试用示例代码来显示它。
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
这表明在_updateFromConversion
中创建SomeClass
实例时未调用SomeClass()..myFunction = _updateFromConversion;
函数。这只是一个分配(它为字段myFunction
分配了值_updateFromConversion
...是的,在Dart中,函数本身可以是一个值)!
您应该知道,因为函数名称后没有()
,并且Dart中的函数调用始终必须包含()
之间的参数列表,即使它为空。
因此,在这里调用函数:
c.myFunction("foo");
看到了吗?有一个包含单个值"foo"
的参数列表。这就是为什么函数然后输出Unit name: foo
的原因,因为参数unitName
取值为"foo"
。
TL; DR
这是一个函数调用:
c.myFunction("foo");
这不是:
c.myFunction;