好坏:在Dart / Flutter中声明主要方法异步

时间:2019-05-14 11:13:30

标签: dart flutter

我在整个应用程序中声明一个全局变量-SharedPreferences prefs,并使用main方法对其进行初始化。

但是,SharedPreferences初始化返回一个Future-因此我尝试等待它在应用程序的main关闭中得到解决:

SharedPreferences prefs;

void main() async {
  prefs = await SharedPreferences.getInstance();

  return runApp(MyApp());
}

效果很好。我目前在生产中的2个应用程序中使用了此方法,但突然发现使main方法异步可能是不正确的。

最后我有两个问题:

  • main方法如何被调用以及在Dart / Flutter中通常如何工作?
  • 使应用程序的main方法异步会带来意外的行为吗? (到目前为止)

2 个答案:

答案 0 :(得分:5)

  

在Dart / Flutter中,如何调用main方法以及其一般如何工作?

Dart VM(或AOT模式下的运行时)查找并执行名为main的函数。 main返回后,VM将退出之前等待未完成的异步操作完成。 Dart官方网站上的Asynchronous programming文章中有一个示例说明了这一点:

  
      
  1. main()执行完毕后,异步功能可以恢复执行。首先,gatherNewsReports()返回的前途完成。然后printDailyNewsDigest()继续执行,打印新闻。
  2.   
  3. printDailyNewsDigest()函数主体完成执行后,它最初返回的将来完成,并且应用程序退出。
  4.   

(请注意,exit function将立即终止,而无需等待。)


  

使应用程序的主要方法异步会带来意外的行为吗? (到目前为止)

不。首先,您应该记住async关键字不是不是,它使函数异步。 async关键字仅允许使用await关键字(它本身是用于注册Future.then回调的语法糖)的使用,并且(主要)要求声明该函数以返回{{ 1}}。 (我之所以说“主要”是因为允许返回Future而不是void,尽管如果启用avoid_void_async lintFuture<void>也会对此表示抱怨。)

一旦调用 any 异步函数,您的应用程序将固有地是异步的。调用异步函数时,您可以:

  • 等待它完成(通过dartanalyzerawait)。然后,调用方也是异步的。
  • 无需等待异步操作(“一劳永逸”)。但这仍然意味着Future.then可以在异步操作仍未完成的情况下返回。

无论哪种方式,您的应用程序都必须等待终止(假设它没有因未捕获的异常或main而异常终止)。

由于您的exit函数使用main,因此您甚至无法选择将其标记为await

答案 1 :(得分:0)

@jamesdlin的好人。

您问题的字面答案

  

如何在Dart中调用main方法以及其一般如何工作   /扑通?

对于Android应用,Dart入口点通过DartExecutor调用。您可以在这里查看:DartExecutor class

有一个简短的文档,说明如何手动执行FlutterApplication的操作: wiki/Experimental:-Launch-Flutter-with-non-main-entrypoint

如果您想更深入地学习,请寻找以下类:FlutterApplicationFlutterActivityFlutterMain