我在整个app-SharedPreferences prefs中声明了一个全局变量,并用main方法初始化它.

然而,SharedPreferences初始化返回Future-因此我试图在main关闭应用程序时等待它得到解决:

SharedPreferences prefs;

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

  runApp(MyApp());
}

而且效果很好.我目前在生产中的两个应用程序中使用了这种方法,我突然想到,让main个方法异步可能是不对的.

最后,我有两个问题:

  • 在DART/Ffltter中,main方法是如何调用的,以及它通常是如何工作的?
  • APP异步的Making main方法会带来意想不到的行为吗?(到目前为止还没有)

推荐答案

在DART/Ffltter中,Main方法是如何调用的,以及它通常是如何工作的?

DART VM(或AOT模式下的运行时)查找并执行名为main的函数.main返回后,VM将等待挂起的异步操作完成,然后再退出.DART官方网站上的Asynchronous programming篇文章有一个例子证明了这一点:

  1. main()完成执行时,异步函数可以恢复执行.首先,gatherNewsReports()返回的future 完成了.然后printDailyNewsDigest()继续执行,打印新闻.
  2. printDailyNewsDigest()函数体完成执行时,它最初返回的future 完成,应用程序退出.

(请注意,exit function将导致立即终止,无需等待.)


APP的Main方法异步会带来意想不到的行为吗?(到目前为止还没有)

不是的.首先,您应该记住,async关键字是not,它使函数成为异步的.async关键字只允许使用await关键字(它本身就是注册Future.then回调的语法糖),并且(主要)要求声明函数返回Future.(我说"大部分"是因为允许返回void而不是Future<void>,尽管如果启用了avoid_void_async lint,dartanalyzer也会抱怨这一点.)

一旦您调用any个异步函数,您的应用程序将本质上是异步的.调用异步函数时,您可以执行以下任一操作:

  • 等待完成(通过awaitFuture.then).然后调用方也是异步的.
  • 异步操作是未被等待的("即发即忘").但这仍然意味着main可以返回,异步操作仍处于挂起状态.

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

因为你的main函数使用await,你甚至没有 Select 标记async.

Flutter相关问答推荐

如何在Flutter中的textformfield上显示标签文本?

类型flatter doctor get zsh:未找到命令:macO中flatter

如何将图像从顶部和底部半向外设置为飘动

当第二页在单独的小工具中使用Navigator.pop时,Navigator.push不起作用

SingleChildScrollView正在将Container的高度限制为子对象,尽管使用了Expanded Inside Row()

build_runner显示错误没有为类ClassDeclaration定义getter宏关键字'

如何创建一个按钮来在Ffltter Webview中转到上一页?

下拉图标未居中

如何知道当前屏幕是否处于抖动状态?

如何在容器小部件中的图像旁边添加文本?

如何使页面浏览量达到活动页面所要求的高度?

脚本具有不受支持的MIME类型(';Text/html';).(messaging/failed-service-worker-registration)

将列表<;Events>;从Flutter 应用程序中的函数传回EventLoader属性时出错

使用Ffltter CREATE创建项目时,androidManifest.xml中缺少包属性

为什么我的Flutter 动画过渡没有发生?

在 Flutter 中从 FireStore 获取数据并编译它们需要太多时间

Flutter 中的区域不匹配

点击按钮后重新启动定时器

Flutter底部面板局部显示

小部件库捕获的 Flutter 异常