flutter - 您如何在不传递参数的情况下在Flutter中调用void函数?

标签 flutter dart valuechangelistener

我是Flutter的新手,正在学习有关Udacity的入门类(class)。在其中一项任务中,我试图遵循代码,但我对此并不太了解。这是项目解决方案中的代码(我剪切并粘贴了重要的部分,还有法律声明,我不拥有任何代码,它来自示例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。这不应该引发错误吗?

如果有人可以解释这段代码的流程以及我所缺少的内容,我将不胜感激。
谢谢!

最佳答案

您似乎误解了为函数调用将变量分配给函数。

让我尝试用示例代码来展示它。

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;

关于flutter - 您如何在不传递参数的情况下在Flutter中调用void函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60801899/

相关文章:

flutter - 如何在 Flutter 中启用相机闪光灯?

dart - flutter 垂直视口(viewport)无界高度错误

dart - Flutter - 使用自定义十六进制颜色

java - JTable valuechanged 然后更改单元格颜色

setValue(true) 时 gwt 复选框触发处理程序

java - :ValueChangeListener nullifying EJB injection

Flutter:如何在创建类时最好地实例化 SQFlite db 对象

Flutter 在更新时删除 Hive 数据库

flutter - 如何在Flutter中导入视频中的字幕文件?

dart - 从 Flutter 中的 List<Widget> 中删除 Index wise CustomWidget