我在整个应用程序中声明一个全局变量-SharedPreferences prefs
,并使用main
方法对其进行初始化。
但是,SharedPreferences
初始化返回一个Future
-因此我尝试等待它在应用程序的main
关闭中得到解决:
SharedPreferences prefs;
void main() async {
prefs = await SharedPreferences.getInstance();
return runApp(MyApp());
}
效果很好。我目前在生产中的2个应用程序中使用了此方法,但突然发现使main
方法异步可能是不正确的。
最后我有两个问题:
main
方法如何被调用以及在Dart / Flutter中通常如何工作?main
方法异步会带来意外的行为吗? (到目前为止)答案 0 :(得分:5)
在Dart / Flutter中,如何调用main方法以及其一般如何工作?
Dart VM(或AOT模式下的运行时)查找并执行名为main
的函数。 main
返回后,VM将退出之前等待未完成的异步操作完成。 Dart官方网站上的Asynchronous programming文章中有一个示例说明了这一点:
main()
执行完毕后,异步功能可以恢复执行。首先,gatherNewsReports()
返回的前途完成。然后printDailyNewsDigest()
继续执行,打印新闻。printDailyNewsDigest()
函数主体完成执行后,它最初返回的将来完成,并且应用程序退出。
(请注意,exit
function将立即终止,而无需等待。)
使应用程序的主要方法异步会带来意外的行为吗? (到目前为止)
不。首先,您应该记住async
关键字不是不是,它使函数异步。 async
关键字仅允许使用await
关键字(它本身是用于注册Future.then
回调的语法糖)的使用,并且(主要)要求声明该函数以返回{{ 1}}。 (我之所以说“主要”是因为允许返回Future
而不是void
,尽管如果启用avoid_void_async
lint,Future<void>
也会对此表示抱怨。)
一旦调用 any 异步函数,您的应用程序将固有地是异步的。调用异步函数时,您可以:
dartanalyzer
或await
)。然后,调用方也是异步的。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
如果您想更深入地学习,请寻找以下类:FlutterApplication
,FlutterActivity
,FlutterMain
。