如何捕捉"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 之后或将隐含错误。
有什么方法可以在 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 之后或将隐含错误。