【发布时间】:2020-02-29 09:02:02
【问题描述】:
我是 dart 语言和 Flutter SDK 的初学者。 我尝试使用官方 Flutter 项目中的 analysis_option.yml 来制作清晰的代码。
似乎在大括号之前添加<dynamic> 会删除警告,但这对我来说没有意义。
有人可以解释为什么这是必要的吗?以及作用域如何返回类型?
【问题讨论】:
我是 dart 语言和 Flutter SDK 的初学者。 我尝试使用官方 Flutter 项目中的 analysis_option.yml 来制作清晰的代码。
似乎在大括号之前添加<dynamic> 会删除警告,但这对我来说没有意义。
有人可以解释为什么这是必要的吗?以及作用域如何返回类型?
【问题讨论】:
因为你把=> <dynamic>放在匿名函数的开头:
// vv vvvvvvvvv
.then((dynamic currentUser) => <dynamic> {
通过这样做,您已经声明了一个返回 Set<dynamic> 的 lambda 函数,而不是带有主体的匿名函数。继续:
if (currentUser == null)
<dynamic> {...}
Dart 现在认为您正在定义 Set 的元素。 Dart 还支持集合条件,因此您的 if/else 被解释为 Set 文字中的条件。
(如果你不知道什么是集合条件,它类似于 Python 组合,基本上意味着[ 1, if (false) 2 else 3 ] 将生成列表[1, 3]。)
因此,因为您还为 if 语句提供了一个主体,但在其单个语句的末尾没有分号,Dart 再次认为您指定了 Set。由于 Dart 自动格式化程序非常有用,因此建议您向您在 else 语句下“定义”的 Set 文字添加显式类型注释。
else
{...}
// Dart formatter: "It looks like you are trying to create
// a `Set<dynamic>`. Do you need some help
// with that?"
本质上,根本原因是因为=>。在 Dart 中,只有在定义 lambda(也就是单行匿名函数)时才使用 =>。 (与 Javascript 相比,它的所有匿名函数都使用 =>,无论是否使用 lambda。多语言程序员不是最棒的吗?)
如果您取出=> <dynamic>,它应该会修复所有“错误”。
【讨论】:
=> <void>,对吗?因为如果我删除返回类型,我会在函数大括号上收到相同的警告编辑:不,好的,我知道了,如果我删除 =>,我的函数就变成了一个匿名函数,然后不返回并且没有不必提供返回类型