好坏:在Dart / Flutter中声明主要方法异步
问题内容:
我在整个app中声明了一个全局变量- SharedPreferences prefs
,并在main
方法中对其进行了初始化。
但是,SharedPreferences
初始化返回一个Future
-因此我尝试等待它main
在应用程序关闭时解决:
SharedPreferences prefs;
void main() async {
prefs = await SharedPreferences.getInstance();
runApp(MyApp());
}
而且效果很好。目前,我在生产中的2个应用程序中都使用了此方法,但我突然发现使该main
方法异步化可能不正确。
最后我有两个问题:
main
在Dart / Flutter 中,方法是如何被调用的以及通常如何工作?main
应用程序的制作方法是否会带来意外的行为?(到目前为止)
问题答案:
main方法如何被调用以及在Dart / Flutter中通常如何工作?
Dart
VM(或AOT模式下的运行时)查找并执行名为的函数main
。后main
返回时,VM将等待退出前挂起到完整的异步操作。在异步编程官方飞镖网站上的文章有演示这样的例子:
7.
当main()
执行完,异步功能可以恢复执行。首先,由归还的未来gatherNewsReports()
完成。然后printDailyNewsDigest()
继续执行,打印新闻。
8. 当printDailyNewsDigest()
函数主体完成执行时,它最初返回的将来完成,并且应用程序退出。
(请注意,该exit
函数将导致立即终止,而无需等待。)
使应用程序的主要方法异步会带来意外的行为吗?(到目前为止)
否。首先,您应该记住,async
关键字 不是
使函数异步的原因。该async
关键字只是让使用的await
关键字(这本身就是对登记语法糖Future.then
回调)和(大部分)要求函数声明为返回Future
。(我之所以说“主要”是因为允许返回void
而不是返回Future<void>
,尽管dartanalyzer
如果启用了avoid_void_async
lint也会抱怨这一点。)
一旦调用 任何 异步函数,您的应用程序将固有地是异步的。调用异步函数时,您可以:
- 等待它完成(通过
await
或Future.then
)。然后,调用方也是异步的。 - 无需等待异步操作(“一劳永逸”)。但这仍然意味着
main
可以返回的异步操作仍在等待中。
无论哪种方式,您的应用程序都必须在终止之前等待(假设它没有因未捕获的异常而异常终止exit
)。
由于您main
使用了函数await
,您甚至没有选择标记的选择async
。