flutter - 参数 Future 不能分配给参数类型 void Function()
问题描述
我在按钮所在的位置有一个 statefull widged
onPressed: _exportData,
_exportData 以这种方式定义的位置
Future<void> _exportData() async {
...
setState(() {
_message = 'A message'; // I want to use localization string here
});
}
我需要将本地化字符串传递到上面的 setState() 中,我这样做
Lang.key(ctx, 'about')
即我需要在那里传递上下文,但是当我尝试使它像这样
onPressed: _exportData(ctx), // the error here
和
Future<void> _exportData(BuildContext ctx) async {...
onPressed有错误
参数 Future 不能分配给参数类型“void Function()”
cat 我如何在_exportData内部传递上下文,或者如何使用_exportData内部的本地化字符串?
更新:实际上没有必要将上下文传递给 _exportData,因为上下文在状态类中是可用的
解决方案
onPressed: () async { await _exportData(context) }
进行此更改并让我们知道。
编辑:
onPressed: _exportData(ctx), // 这里的错误
您不能这样做,因为您只能在 onPressed 中传递对函数的引用。如果你想将参数传递给一个函数,你必须按照我上面展示的方式来做(尽管它不一定是异步的)。没有左括号和右括号的函数名是引用,而带括号的函数名是实际的函数调用。
原因是 onPressed 获取函数/指针的引用/地址,而不是实际的函数调用。因此,如果我们必须以您的方式传递参数(在您的情况下为上下文),我们将需要将括号放在参数周围,使其成为函数调用而不是引用,因此在构建方法运行时立即执行它而不是何时onPressed 触发它。
我向您展示的方式是为 onPressed 分配一个匿名函数。看,最后没有括号,所以不要立即执行它并充当对函数的引用。我放了一个 async 并在那里等待,因为您的 _exportData 函数返回一个未来。
希望能解开你的疑惑!
推荐阅读
- r - 如何使用索引为 1 的另一列中的值创建新列
- amazon-web-services - 如何配置 AWS SQS 队列以侦听已创建的 S3 存储桶的事件
- jquery - jquery 验证等于在 ASP.net 内容页面中不起作用
- javascript - 如何编写通用方法来处理 React 中的多个状态更改
- opencv - 'cmake' 将引发“OpenCVGenSetupVars.cmake”错误(配置 OpenCV 时)
- python - 如何从 python 中的 ODE 中获取常量?
- java - onItemSelected(AdapterView parent, View view, int position, long id)中的parent和view是什么意思
- unity3d - HLSL / GLSL 高精度sqrt可行吗?
- python - 如何记住我们使用的是 v.function() 还是 function(v)?
- javascript - 如何在 vuejs 中将对象附加到 formData