展开运算符可以用于提供函数参数吗?

iva*_*esi 3 dart flutter

我正在编写扩展 statelessWidget 的类,它的构建方法返回Text()小部件。我需要将来自Map<dynamic, dynamic>. 为什么我不能spread像这样使用运算符

final Map textOptions;
final String text;

build(BuildContext context) {
    return Text(text, ...textOptions)
}
Run Code Online (Sandbox Code Playgroud)

jam*_*lin 8

您目前只能将扩展运算符用于集合文字([]for List{}forMapSet)。

来自Bob Nystrom介绍 Dart 2.3 新特性的文章

点差只能出现在可以优雅地处理接收零个或多个值的地方。如果不彻底修改语言的执行模型并将其转换为 Icon(我觉得这很吸引人,但可能不实用……),符合该约束的地方并不多。基本上是集合文字和位置参数列表。(我为后者了一个提案,但它非常复杂,所以我们没有这样做,至少现在没有。)

然而,该提议并没有完全涵盖您想要的内容,即将 a 扩展Map为可选的命名参数。

  • @cbr 扩展运算符没有任何变化;将可迭代对象作为函数参数传播仍然会丢失类型信息。现在确实存在构造函数剥离,因此 lrn 提到的“Function.apply”示例可以工作。 (3认同)
  • 它不起作用的原因是没有办法以这种方式*输入检查*参数。即使映射的类型为 `Map&lt;Symbol, int&gt;` 并且所有命名参数的类型均为 `int`,我们仍然无法检查映射中的符号是否对应于方法参数。实际上,这只是一个等待发生的运行时错误。如果我们有构造函数撕裂(我们应该),那么你可能会做`Function.apply(Text, [text], textOptions)`。遗憾的是,您还不能删除构造函数,因此您必须创建一个函数来转发所有参数。 (2认同)

Jul*_*hal 1

我认为扩展运算符不能与Listand arrays以外的其他东西一起使用[1, 2, 3]
也许您可以首先将 Map 转换为 List,然后使用展开运算符。