【问题标题】:What is the proper way to load images in Flutter and handle exceptions on load在 Flutter 中加载图像并处理加载异常的正确方法是什么
【发布时间】:2020-10-02 09:55:59
【问题描述】:

我想知道从设备加载图像的正确方法是什么,并在图像丢失或损坏时处理异常。用户从设备中选择图像,我想打开它。我稍后会在我的代码中使用该图像,因此仅在某些小部件中显示它是不够的。 目前,我使用的以下代码在大多数情况下都能正常工作:

  Future<ui.Image> imageLoadFromDevice(String path) async {

    await askPermissionForStorage();

    ImageProvider imageProvider = FileImage (  File ( path ), scale: 1 );

    Completer<ImageInfo> completer = Completer();
    imageProvider.resolve(ImageConfiguration()).addListener(ImageStreamListener((ImageInfo info, bool _) {
      completer.complete(info);
    }));

    ImageInfo imageInfo = await completer.future;

    return imageInfo.image;
  }

但是如果图像丢失或损坏,控制台中会打印“图像资源服务捕获的异常”,但我在此函数上方的异常捕获器没有收到异常。

  1. 我是否可以正确加载图像,还是有更好的方法?
  2. 如果此代码正常,我应该如何捕获异常,尤其是丢失的文件或损坏的图像?

【问题讨论】:

    标签: flutter


    【解决方案1】:

    我不确定图像是否损坏,但在文件丢失的情况下,您可以将File(path) 存储在变量中,并在设置 ImageProvider 之前使用varname.exists() 进行检查。

    【讨论】:

    • 谢谢,我熟悉 File(path).exists()。在这种情况下绝对有可能。但是在比赛/边缘情况下,“存在”仍然有可能返回真,然后文件将被某些东西删除,我会尝试打开丢失的文件。所以在这种情况下我需要收到一个例外。但是这段代码只是在控制台打印:“图像资源服务捕获的异常。无法打开文件,路径= ...”,但没有异常,所以我无法捕获它。
    【解决方案2】:

    好问题! :)

    您可以使用下面更简单的代码,即根据需要加载图像。

    import 'dart:ui' as ui;
    
      Future<ui.Image> imageLoadFromDevice(String path) async {
    
        await askPermissionForStorage();
    
        File fileImage = File(path);
        final Uint8List imageUint8List =  await fileImage.readAsBytes();
        final ui.Codec codec = await ui.instantiateImageCodec(imageUint8List);
        final ui.FrameInfo frameInfo = await codec.getNextFrame();
    
        return frameInfo.image;
      }
    

    要从这段代码中捕获异常,您可以将它放在 try-catch 中。加载图像时的任何异常都应该产生一个可以被捕获和处理的一般异常。

    【讨论】:

      猜你喜欢
      • 2018-05-28
      • 2012-04-04
      • 1970-01-01
      • 2012-03-29
      • 1970-01-01
      • 2020-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多