【问题标题】:A value of type 'Future<bool>' can't be returned from the function because it has a return type of 'Future<void>'无法从函数返回类型为“Future<bool>”的值,因为它的返回类型为“Future<void>”
【发布时间】:2022-01-04 15:52:54
【问题描述】:

我有:

Future<bool> foo() async => true;

这是允许的:

Future<void> bar()  {
  return foo(); // Works
}

但这不是:

Future<void> baz() async {
  return foo(); // Error
}

barbaz 中,我都返回了Future&lt;bool&gt;,但为什么第一个有效但第二个失败?


注意:这个问题不是关于如何让它发挥作用,而是为什么一个有效而另一个无效。

【问题讨论】:

  • 返回类型为“Future”的方法应始终使用 async 关键字。
  • 两者都在这里工作...
  • @Raegtime 不,恰恰相反。
  • 你说得对! :-)

标签: dart dart-null-safety


【解决方案1】:

Dart 对void 返回函数有特殊规则:你不能返回一个值因为它被声明为不返回任何值,所以实际上试图返回一个值可能是一个错误。

没有Future也会发生同样的情况:

void qux() {
  return true; // Error, can't return value from void function
}

给出错误

A value of type 'bool' can't be returned from the function 'qux' because it has a return type of 'void'.

您可以拥有return e; 语句,但前提是e 的类型为voidNulldynamic。 (你甚至不应该这样做,那些只是为了使现有代码工作而被允许的。) (始终允许使用 =&gt; e 正文,因为人们喜欢将其用作 { e; } 的简写,主要是因为格式化程序将其保留在一行上。我仍然建议使用 { e; } 作为 void 函数的正文.)

将其推广到具有void 未来返回类型的async 函数, 您不能从 Future&lt;void&gt; ... async 函数返回 实际 值。因此,您可以返回的唯一内容是 voiddynamicNullFuture&lt;void&gt;Future&lt;dynamic&gt;Future&lt;Null&gt;Future&lt;bool&gt; 两者都不是。

你应该写的是:

Future<void> baz() async {
  await foo();
}

【讨论】:

    【解决方案2】:

    正如我在运行相同代码时所观察到的那样

    Future<bool> foo() async => true;
    
    Future<void> bar() {
      return foo(); // Works
    }
    
    Future<void> baz() async {
      // return foo(); // Error
    }
    
    void main() {
      print("direct =====${foo()}");
      print("bar==========${bar()}");
      print("bazz========${baz()}");
    }
    

    回应是

    direct =====Instance of '_Future<bool>'
    bar==========Instance of '_Future<bool>'
    bazz========Instance of '_Future<void>'
    

    这表示当 async 关键字不存在时,它采用返回值的返回类型。

    但是对于 bazz 函数,它提供了一个快速修复函数

    Future<Future<bool>>
    

    所以当添加异步时,函数返回类型被视为主要类型

    【讨论】:

      【解决方案3】:
      Future<bool> foo() async => true;
      

      第一个案例

      Future<void> bar()  {
        return foo(); // Works
      }
      

      对于上面的代码,Future&lt;void&gt; bar()的返回可以返回foo(),因为bar()不是直接返回foo()的值,所以bar()可以处理foo()没有问题。

      但是,在第二种情况下:

      Future<void> baz() async {
        return foo(); // Error
      }
      

      上面的代码是直接返回foo()的泛型类型,因为baz()的函数包含async标签,所以baz()作为Future&lt;void&gt;会麻烦,也就是我们知道@ 987654334@ 为Future&lt;bool&gt;

      【讨论】:

        猜你喜欢
        • 2021-09-27
        • 1970-01-01
        • 1970-01-01
        • 2022-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-08
        • 1970-01-01
        相关资源
        最近更新 更多