Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 如何在不传递参数的情况下调用颤振中的空洞函数?_Flutter_Dart_Valuechangelistener - Fatal编程技术网

Flutter 如何在不传递参数的情况下调用颤振中的空洞函数?

Flutter 如何在不传递参数的情况下调用颤振中的空洞函数?,flutter,dart,valuechangelistener,Flutter,Dart,Valuechangelistener,我是个新手,现在正在学习Udacity的入门课程。在其中一个任务中,我试图遵循代码,但我对它没有太多的理解。以下是项目解决方案中的代码(我已经剪切并粘贴了重要的部分,并且法律声明我不拥有这些代码中的任何代码,它来自示例flifter Udacity项目): 小部件构建(构建上下文){ 最终输入=填充( 填充:_填充, 子:列( crossAxisAlignment:crossAxisAlignment.stretch, 儿童:[ TextField(…), _createDropdown(_fr

我是个新手,现在正在学习Udacity的入门课程。在其中一个任务中,我试图遵循代码,但我对它没有太多的理解。以下是项目解决方案中的代码(我已经剪切并粘贴了重要的部分,并且法律声明我不拥有这些代码中的任何代码,它来自示例flifter Udacity项目):

小部件构建(构建上下文){
最终输入=填充(
填充:_填充,
子:列(
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
(在这个“简单”的例子中,可能会让你头脑发热!),它就像一个别名,所以你可以命名一个