-2

在我的颤振应用程序中,我想根据条件加载资产:我的代码是作为导入包运行还是作为我目前正在开发的应用程序运行。

问题是这个 try/catch 块总是在 try 部分失败:

AssetImage _getBackgroundImage() {
    try {
      return AssetImage(
        'lib/assets/images/menu_background.png',
        package: 'my_package',
      );
    } catch (e) {
      return AssetImage('lib/assets/images/menu_background.png');
    }
  }

运行输出:

======== Exception caught by image resource service ================================================
The following assertion was thrown resolving an image codec:
Unable to load asset: packages/my_package/lib/assets/images/menu_background.png

When the exception was thrown, this was the stack: 
#0      PlatformAssetBundle.load (package:flutter/src/services/asset_bundle.dart:227:7)
<asynchronous suspension>
#1      AssetBundleImageProvider._loadAsync (package:flutter/src/painting/image_provider.dart:667:14)
<asynchronous suspension>
Image provider: AssetImage(bundle: null, name: "packages/my_package/lib/assets/images/menu_background.png")
Image key: AssetBundleImageKey(bundle: PlatformAssetBundle#e01ff(), name: "packages/my_package/lib/assets/images/menu_background.png", scale: 1.0)
====================================================================================================

4

2 回答 2

0

正如您在堆栈跟踪中看到的那样,AssetImage 稍后会异步加载图像。因此,在 Flutter 绘制图像之前,AssetImage 对象的创建不会引发异常。这导致您的 catch 子句永远不会被调用。

要解决这个问题,您最好事先检查图像是否存在。这是一个关于如何做到这一点的关于stackoverflow的答案的问题。

于 2021-05-14T14:24:16.803 回答
0

Try & Catch 块用于捕获软件运行时环境中的一些错误。作为您的问题,您在 catch 块中编写了一些代码,因为尝试总是失败。这不是一个标准。始终尝试使您的代码符合编码标准。

第二件事是我在您的代码中看到项目文件夹中的资产文件夹不在 lib 文件中。

于 2021-05-14T15:14:28.103 回答