Flutter 如何在不传递参数的情况下调用颤振中的空洞函数?
我是个新手,现在正在学习Udacity的入门课程。在其中一个任务中,我试图遵循代码,但我对它没有太多的理解。以下是项目解决方案中的代码(我已经剪切并粘贴了重要的部分,并且法律声明我不拥有这些代码中的任何代码,它来自示例flifter Udacity项目):Flutter 如何在不传递参数的情况下调用颤振中的空洞函数?,flutter,dart,valuechangelistener,Flutter,Dart,Valuechangelistener,我是个新手,现在正在学习Udacity的入门课程。在其中一个任务中,我试图遵循代码,但我对它没有太多的理解。以下是项目解决方案中的代码(我已经剪切并粘贴了重要的部分,并且法律声明我不拥有这些代码中的任何代码,它来自示例flifter Udacity项目): 小部件构建(构建上下文){ 最终输入=填充( 填充:_填充, 子:列( crossAxisAlignment:crossAxisAlignment.stretch, 儿童:[ TextField(…), _createDropdown(_fr
小部件构建(构建上下文){
最终输入=填充(
填充:_填充,
子:列(
crossAxisAlignment:crossAxisAlignment.stretch,
儿童:[
TextField(…),
_createDropdown(_fromValue.name,_updateFromConversion),
],
),
);
}
void\u updateFromConversion(动态单元名){
设置状态(){
_fromValue=\u getUnit(unitName);
});
如果(_inputValue!=null){
_updateConversion();
}
}
小部件\u createDropdown(字符串currentValue,值更改后立即更改){
返回容器(
边距:仅限边缘集(顶部:16.0),
装饰:盒子装饰(…),
填充:边缘设置。对称(垂直:8.0),
儿童:主题(…),
子项:DropdownButtonHideUnderline(
孩子:ButtonTheme(
alignedDropdown:正确,
孩子:下拉按钮(
值:当前值,
项目:_unitMenuItems,
一旦改变:一旦改变,
样式:Theme.of(context).textTheme.title,
),
),
),
),
);
}
这就是我被困的地方_updateFromConversion需要输入参数unitName。但是当他们在下拉菜单中调用它时,他们不会传递任何消息。那么updateFromConversion如何知道unitName是什么呢?另外,_updateFromConversion是在_createDropdown之前执行的,还是在设置DropdownButton的“onChanged”属性时执行的
第二个问题:他们正在将返回类型为void的函数传递到_createDropdown中,该函数期望值更改。这不应该是一个错误吗
如果有人能解释这段代码的流程和我遗漏了什么,我将不胜感激。
谢谢大家! Yashvin
In dart函数可以作为参数传递给其他函数。例如,这通常用于传递回调
在您提供的示例中,函数_updateFromConversion在更改为另一个函数_createDropdown时作为参数传递
在该函数中,它将被分配给DropdownButton的onChanged侦听器
每次DropdownButton的值发生变化时,将调用此函数,并将其传递给DropdownButton的选定值。Yashvin
In dart函数可以作为参数传递给其他函数。例如,这通常用于传递回调
在您提供的示例中,函数_updateFromConversion在更改为另一个函数_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=\u updateFromConversion中创建SomeClass
实例时,不会调用\u updateFromConversion
函数代码>。这只是一个赋值(它给字段myFunction
赋值\u updateFromConversion
…是的,在Dart中,函数本身可以是一个值)
您应该知道,因为函数名后面没有()
,Dart中的函数调用始终必须包含()
之间的参数列表,即使它是空的
下面是调用函数的地方:
c.myFunction("foo");
看到了吗?这里有一个包含单个值的参数列表,“foo”
。这就是函数随后打印unitName:foo
的原因,因为参数unitName
取值“foo”
TL;博士
这是一个函数调用:
c.myFunction("foo");
这不是:
c.myFunction;
您似乎误解了为函数调用将变量赋值给函数
让我试着用示例代码来展示它
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=\u updateFromConversion中创建SomeClass
实例时,不会调用\u updateFromConversion
函数代码>。这只是一个赋值(它给字段myFunction
赋值\u updateFromConversion
…是的,在Dart中,函数本身可以是一个值)
您应该知道,因为函数名后面没有()
,Dart中的函数调用始终必须包含()
之间的参数列表,即使它是空的
下面是调用函数的地方:
c.myFunction("foo");
看到了吗?这里有一个包含单个值的参数列表,“foo”
。这就是函数随后打印unitName:foo
的原因,因为参数unitName
取值“foo”
TL;博士
这是一个函数调用:
c.myFunction("foo");
这不是:
c.myFunction;
这很有道理。因此,接下来有几个问题:1)在我发布的代码中,他们将函数分配给ValueChanged类型。那么,你能将函数分配给任何类型,而不仅仅是函数类型吗?2) 什么时候调用_updateFromConversion?何时分配onChanged属性?因为即使在那里,它们也没有传递参数。ValueChanged
也是一个函数。但它是一个typedef
(在这个“简单”的例子中,可能会让你头脑发热!),它就像一个别名,所以你可以命名一个