如何捕捉"Unable to load asset: assets/images/sample_img_url.png"

How to catch "Unable to load asset: assets/images/sample_img_url.png"

有什么方法可以在 Flutter 中捕获“无法加载资产:assets/images/sample_img_url.png”错误吗?

我想做的是通过提供路径(来自 API)来加载资产图像。但是如果我没有与给定路径关联的图像,我需要加载示例图像。

我创建了一个自定义占位符小部件,如下所示。但是它没有像我预期的那样工作。谁能帮我解决这个问题?

class ImagePlaceHolder extends StatelessWidget {
  final String path;
  final double width;

  const ImagePlaceHolder({Key key, this.path, this.width}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    Image finalImage;
    try{
      finalImage = Image.asset(
          path,
          width: width,
      );
    }
    catch(Exception){
      finalImage = Image.asset(
          "assets/images/app_update_logo.png",
          width: width,
      );
    }
    return finalImage;
  }
}

您必须在 pubspec.yaml 中定义资产路径,如下所示:

flutter:
  assets:
    - assets/my_icon.png
    - assets/background.png

要包含目录下的所有资产,请在末尾指定带有 / 字符的目录名称:

flutter:
  assets:
    - directory/
    - directory/subdirectory/

官方文档: https://flutter.dev/docs/development/ui/assets-and-images

我认为该错误不应在运行时解决。所以只指定现有的图像路径。如果指定路径中没有图像,则不应使用它。

BUT. 如果你仍然想首先捕获异常,你应该明白 Image.asset 是异步工作的。稍后抛出异常,这就是为什么您无法捕获它的原因。看看这篇GitHubissue,希望对你有帮助。

好吧,我终于找到了一个很好的方法来解决这个问题。只需使用错误生成器。

Image.asset(
     "assets/images/subjects/api_given_image_name.png",
     width: 90,
     errorBuilder: (BuildContext context, Object exception, StackTrace stackTrace) {
           return Image.asset(
                "assets/images/your_sample_image.png",
                width: 90,
           );
     },
)

您不需要捕获该异常来实现您想要的。您可以使用 errorBuilder 函数来 return 您喜欢的任何小部件。

      Image.asset(
        "assets/images/app_update_logo.png",
        width: width,
        errorBuilder: (context, error, stackTrace) {
          return Image.asset(
            "assets/images/error_logo.png",
            width: width,
          );
        },
      );

祝你好运!

空安全的快速更新答案:

Image.asset(
 "assets/images/subjects/api_given_image_name.png",
 width: 90,
 errorBuilder: (BuildContext context, Object exception, StackTrace? stackTrace) {
       return Image.asset(
            "assets/images/your_sample_image.png",
            width: 90,
       );
 },
)

需要?在 StackTrace 之后或将隐含错误。