【问题标题】:Flutter Future<void> vs Future<Null> vs voidFlutter Future<void> vs Future<Null> vs void
【发布时间】:2021-07-11 02:28:17
【问题描述】:

两者的主要区别是什么:

  1. Future&lt;void&gt; function(){}
  2. Future&lt;Null&gt; function(){}
  3. void function() {}
  4. funtion(){}

有时我在调用 API 时使用 void 或 future,但我真的不知道主要区别是什么以及何时使用它合适?

【问题讨论】:

    标签: flutter dart


    【解决方案1】:
    1. Future&lt;void&gt; function() {}

      定义了一个异步函数,该函数最终什么也不返回,但可以在最终完成时通知调用者。另见:What's the difference between returning void vs returning Future?

    2. Future&lt;Null&gt; function() {}

      定义一个异步函数,当它最终完成时最终返回null。不要使用这个;这是Future&lt;void&gt; 的古老形式。它早于 Dart 2 并且是必要的,因为 void 还不是正确的类型,并且没有机制表明 Future 不应该返回任何内容。另见:Dart 2: Legacy of the void

    3. void function() {}

      定义一个不返回任何内容的函数。如果函数执行异步工作,调用者将无法直接判断它何时完成。

    4. function() {}

      定义一个未指定返回类型的函数。返回类型隐式为dynamic,这意味着该函数可以返回任何内容。不要这样做,因为它没有传达意图;读者将无法判断返回类型是有意还是无意省略的。它还将触发always_declare_return_types lint。如果你真的想返回一个dynamic 类型,你应该明确地使用dynamic function() {}

    【讨论】:

      【解决方案2】:
      1. 默认情况下,function() {} 之类的函数会返回 null 指针值。 当您的函数不返回任何内容且未标记为 async 时,请使用此原型:
      function() { // <- not async
       // ... some code
       // ... don't use return
      }
      
      1. (可选)您可以使用void function() {} sintaxis 指定不返回值。 function() {} 也是一样,但是如果你在调用后尝试赋值,你会在编译时得到一个错误:

      Error: This expression has type 'void' and can't be used.

      就个人而言,如果您确实没有返回值并且函数不是异步的,我推荐这种方法。 请注意,您可以在普通函数和异步函数中使用void

      1. Future&lt;void&gt; function() async {} 之类的函数用于返回 Future&lt;void&gt; 对象的异步函数。

      我个人推荐 void function() async {} 仅当您在调用函数时不使用 awaitthen,否则使用 Future &lt;void&gt; function() async {}

      一个例子:

      Future<void> myFunction() async {
        await Future.delayed(Duration(seconds: 2));
        print('Hello');
      }
      
      void main() async {
        print(myFunction()); // This works and prints 
                           // Instance of '_Future<void>'
                           // Hello
        // Use this approach if you use this:
        myFunction().then(() {
          print('Then myFunction call ended');
        })
      
        // or this
        await myFunction();
        print('Then myFunction call ended');
      }
      
      void myFunction() async {
        await Future.delayed(Duration(seconds: 2));
        print('Hello');
      }
      
      void main() async {
        print(myFunction()); // This not works
                           // The compile fails and show
                           // Error: This expression has type 'void' and can't be used.
        // In this case you only can call myFunction like this
        myFunction();
      
        // This doesn't works (Compilation Error)
        myFunction().then(() {
          print('Then myFunction call ended');
        });
      
        // This doesn't works (Compilation Error)
        await myFunction();
        print('Then myFunction call ended');
      }
      
      1. 类似Future&lt;Null&gt; function() async {} 的函数返回一个Future&lt;null&gt; 对象。每当您返回 null 时使用它。不建议使用它,因为 Null 类不是从 Object 扩展而来,并且您返回的任何内容都标记错误(返回 null 或显式 null 值的语句除外):
      Future<Null> myFunction() async {
        await Future.delayed(Duration(seconds: 2));
        print('Hello');
      
        // Ok
        return (() => null)();
        
        // Ok
        return null;
      }
      

      【讨论】:

      • 谢谢,讲解很有帮助,通俗易懂
      猜你喜欢
      • 2019-12-29
      • 2022-07-21
      • 1970-01-01
      • 1970-01-01
      • 2015-01-31
      • 2020-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多