我想知道从设备加载图像的正确方式是什么,如果图像丢失或损坏,则处理异常。用户从设备中选择一个图像,我想打开它。我在后面的代码中使用了这个图像,所以仅仅在一些小部件中显示是不够的。目前,我使用的代码在大多数情况下运行良好:
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;
}但是,如果图像丢失或损坏,控制台中会打印“图像资源服务捕获的异常”,但我的异常捕捉器在此函数之上没有得到异常。
发布于 2020-10-05 05:42:41
好问题!:)
您可以在下面使用更简单的代码,即按需要加载图像。
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中。加载图像时出现的任何异常,都应产生可捕获和处理的一般异常。
发布于 2020-10-02 10:01:17
我不确定损坏的图像,但在缺少文件的情况下,可以将File(path)存储在变量中,并在设置ImageProvider之前使用varname.exists()进行检查。
发布于 2022-09-02 16:51:45
若要处理来自ImageStream的错误,请使用onError argument to the ImageStreamListener constructor
imageProvider.resolve(ImageConfiguration()).addListener(ImageStreamListener(
(ImageInfo info, bool _) { }, // called for success
onError: (Object error, StackTrace? stackTrace) { }, // called for error
));https://stackoverflow.com/questions/64169620
复制相似问题