Flutter 应用发布构建挂起调用 getApplicationDocumentsDirectory();

Posted

技术标签:

【中文标题】Flutter 应用发布构建挂起调用 getApplicationDocumentsDirectory();【英文标题】:Flutter app release build hangs on call to getApplicationDocumentsDirectory(); 【发布时间】:2021-04-25 16:08:25 【问题描述】:

我已经创建了我的第一个 Flutter 移动应用,并已在 2 台笔记本电脑上的模拟器和我的 Galaxy S7 上以调试模式成功测试(模拟器和手机在同一 android 版本上)。所有发布尝试都可以正常构建并在我的 S7 上毫无问题地安装。但是,在 S7 上打开应用程序以进行发布构建时,我的初始化代码挂在以下调用上

目录 docDir = await getApplicationDocumentsDirectory();

我的理解是,这是返回应用程序的内部文档存储,因此我假设它不需要任何特殊权限。那是对的吗?但是,作为测试,我将这些行添加到我的清单中

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

然后,在安装应用程序后(但在启动之前),我进入手机设置并打开了此应用程序的存储权限。但是,启动它仍然会产生相同的结果。

我也干净地运行了 Flutter,结果还是一样。

pubsec 入口 path_provider: ^1.6.27

【问题讨论】:

我想我知道是什么原因造成的,但不知道为什么也没有解决方法。我重写了我的应用程序初始化代码,但我仍然遇到问题,但它是完全不同的调用。那时我意识到我的 S7 似乎在第一次异步调用或至少在第一次调用时失败,语法为“await ...”。这仅发生在 S7 物理设备上,并且仅发生在发布版本上。代码在使用相同 android 版本的 2 台不同笔记本电脑上的 2 台不同模拟器上运行良好,同时适用于调试和发布。在调试模式下也可以在同一个 S7 上正常工作。 我认为这是一个 Flutter 构建问题。我花了大部分时间构建相同代码的 30 个版本(没有更改),并且在物理 S7 设备上安装后,我得到了几个实际工作的版本。所有构建都安装,但在运行时,只有几个构建允许异步作业启动。所有其他构建都挂在 await 命令上。我猜异步作业被杀死或永远不会启动并且颤动没有处理它。 【参考方案1】:

在与flutter 和flutter file_picker 插件团队反复讨论之后,结果发现这是一个flutter/gradle/androd 构建问题。解决办法是here

【讨论】:

以上是关于Flutter 应用发布构建挂起调用 getApplicationDocumentsDirectory();的主要内容,如果未能解决你的问题,请参考以下文章

LoadLibraryW 调用在 IIS 上挂起

如何摆脱挂起的 ajax 调用并加载另一个页面

单击 FCM 通知时,Flutter Notification 挂起的意图被取消

Flutter - 在构建期间调用 setState() 或 markNeedsBuild()

Flutter:在构建期间调用 setState() 或 markNeedsBuild()

SAPUI5 Cordova iOS 应用程序 Ajax 调用不起作用(无限挂起)