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

Geo*_*rge 7 dart flutter

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

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

SharedPreferences prefs;

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

  return runApp(MyApp());
}
Run Code Online (Sandbox Code Playgroud)

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

最后我有两个问题:

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

jam*_*lin 11

main方法如何被调用以及在Dart / Flutter中通常如何工作?

Dart VM(或AOT模式下的运行时)查找并执行名为的函数main。后main返回时,VM将等待退出前挂起到完整的异步操作。在异步编程官方飞镖网站上的文章有演示这样的例子:

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

(请注意,该exit功能将导致立即终止,而无需等待。)


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

否。首先,您应该记住,async关键字不是使函数异步的原因。该async关键字只是让使用的await关键字(这本身就是对登记语法糖Future.then回调)和(大部分)要求函数声明为返回Future。(我之所以说“主要是” voidFuture<void>是因为允许返回而不是返回,尽管dartanalyzer如果启用了avoid_void_asynclint也会抱怨这一点。)

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

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

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

由于您main使用了函数await,您甚至没有选择标记的选择async

  • 好资料。随着我的应用程序的增长,我发现自己需要从主方法进行异步调用。没有发生什么不好的事情,但我总是想知道它是否会破坏沿线的某个地方。 (3认同)

Dan*_* V. 5

来自@jamesdlin 的好消息。

你的问题的字面答案

在 Dart/Flutter 中 main 方法是如何被调用的以及它是如何工作的?

对于 Android 应用程序,Dart 入口点通过DartExecutor. 你可以看看这里:DartExecutor 类

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

如果你想深入挖掘,你想要寻找的类:FlutterApplication, FlutterActivity, FlutterMain