【问题标题】:Type specification for if/else braces in dart飞镖中 if/else 大括号的类型规范
【发布时间】:2020-02-29 09:02:02
【问题描述】:

我是 dart 语言和 Flutter SDK 的初学者。 我尝试使用官方 Flutter 项目中的 analysis_option.yml 来制作清晰的代码。

我被这个警告卡住了:

似乎在大括号之前添加<dynamic> 会删除警告,但这对我来说没有意义。

有人可以解释为什么这是必要的吗?以及作用域如何返回类型?

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    因为你把=> <dynamic>放在匿名函数的开头:

    //                          vv vvvvvvvvv
    .then((dynamic currentUser) => <dynamic> {
    

    通过这样做,您已经声明了一个返回 Set&lt;dynamic&gt; 的 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?"
    

    本质上,根本原因是因为=&gt;。在 Dart 中,只有在定义 lambda(也就是单行匿名函数)时才使用 =&gt;。 (与 Javascript 相比,它的所有匿名函数都使用 =&gt;,无论是否使用 lambda。多语言程序员不是最棒的吗?)

    如果您取出=&gt; &lt;dynamic&gt;,它应该会修复所有“错误”。

    【讨论】:

    • 我没想到会有这么有趣的东西!所以,如果我想“修复”这个问题,我必须在 lamda 函数的开头使用=&gt; &lt;void&gt;,对吗?因为如果我删除返回类型,我会在函数大括号上收到相同的警告编辑:不,好的,我知道了,如果我删除 =&gt;,我的函数就变成了一个匿名函数,然后不返回并且没有不必提供返回类型
    • @ErwanDaniel Dart 使用类型推断来设置匿名函数的返回类型。据我所知,没有办法明确定义返回类型应该是什么。如果要显式设置返回类型,则必须创建一个命名函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    • 2021-04-16
    • 2020-02-20
    • 2015-07-25
    相关资源
    最近更新 更多