Как поймать "Невозможно загрузить актив: assets/images/sample_img_url.png"
Есть ли способ поймать ошибку "Невозможно загрузить актив: активы / изображения /sample_img_url.png" во Flutter?
Я пытаюсь загрузить изображение актива, указав его путь (из 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;
}
}
5 ответов
Хорошо, наконец-то я нашел действительно хороший способ решить эту проблему. Просто используйте построитель ошибок.
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
функция, чтобы вернуть любой виджет, который вам нравится.
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 или загадочная ошибка.
Вы должны определить путь к активу в 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
Я думаю, что ошибка не должна устраняться во время выполнения. Поэтому указывайте только существующие пути к изображениям. Если у вас нет изображения по указанному пути, вы не должны его использовать.
НО. Если вы все еще хотите перехватить исключение, сначала вы должны понимать, что Image.asset работает асинхронно. Исключение возникает позже, поэтому вы не можете его поймать. Взгляните на эту проблему с GitHub, надеюсь, это поможет.