【问题标题】:The argument Future can not be assigned to the parameter type void Function()参数 Future 不能分配给参数类型 void Function()
【发布时间】:2020-08-21 21:36:54
【问题描述】:

我在按钮所在的位置有一个 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不能赋给参数类型 '无效函数()'

我如何在 _exportData 中传递上下文,或者如何在 _exportData 中使用本地化字符串?

更新:实际上没有必要将上下文传递到 _exportData,因为上下文在状态类中是可用的

【问题讨论】:

    标签: flutter


    【解决方案1】:
    onPressed: () async { await _exportData(context) }
    

    进行此更改并告诉我们。

    编辑:

    onPressed: _exportData(ctx), // 这里的错误

    您不能这样做,因为您只能在 onPressed 中传递对函数的引用。如果您想将参数传递给函数,则必须按照我上面显示的方式进行(尽管它不一定是异步的)。没有左括号和右括号的函数名是引用,而带括号的是实际的函数调用。

    这样做的原因是 onPressed 获取函数/指针的引用/地址,而不是实际的函数调用。因此,如果我们必须以您的方式传递参数(在您的情况下为上下文),我们将需要将括号放在参数周围,使其成为函数调用而不是引用,因此在构建方法运行时立即执行它而不是何时onPressed 触发它。

    我向您展示的方式是为 onPressed 分配一个匿名函数。看,最后没有括号,所以不要立即执行它并充当对函数的引用。我放了一个 async 并在那里等待,因为您的 _exportData 函数返回一个未来。

    希望能解开你的疑惑!

    【讨论】:

    • 太棒了。您能否为您的答案添加更多解释?
    • 对答案进行了更改!
    猜你喜欢
    • 2021-02-12
    • 2020-01-05
    • 2023-04-05
    • 1970-01-01
    • 2021-11-24
    • 2022-07-21
    • 2021-10-16
    • 2021-10-10
    • 2021-10-22
    相关资源
    最近更新 更多