Dart try/catch - блок catch не работает
В моем приложении flutter я хочу загружать ресурсы в зависимости от условий: мой код работает как импортированный пакет или как приложение, которое я разрабатываю в настоящее время.
Проблема в том, что этот блок try / catch всегда дает сбой в разделе try:
AssetImage _getBackgroundImage() {
try {
return AssetImage(
'lib/assets/images/menu_background.png',
package: 'my_package',
);
} catch (e) {
return AssetImage('lib/assets/images/menu_background.png');
}
}
запустить вывод:
======== Exception caught by image resource service ================================================
The following assertion was thrown resolving an image codec:
Unable to load asset: packages/my_package/lib/assets/images/menu_background.png
When the exception was thrown, this was the stack:
#0 PlatformAssetBundle.load (package:flutter/src/services/asset_bundle.dart:227:7)
<asynchronous suspension>
#1 AssetBundleImageProvider._loadAsync (package:flutter/src/painting/image_provider.dart:667:14)
<asynchronous suspension>
Image provider: AssetImage(bundle: null, name: "packages/my_package/lib/assets/images/menu_background.png")
Image key: AssetBundleImageKey(bundle: PlatformAssetBundle#e01ff(), name: "packages/my_package/lib/assets/images/menu_background.png", scale: 1.0)
====================================================================================================
2 ответа
AssetImage загружает изображение асинхронно позже, как вы можете видеть в трассировке стека. Поэтому создание объекта AssetImage не вызовет исключения, пока Flutter не отрисовывает изображение. Это приводит к тому, что ваше предложение catch никогда не вызывается.
Чтобы решить эту проблему, вам, вероятно, лучше заранее проверить, существует ли изображение. Вот вопрос с ответами на stackoverflow о том, как это сделать.
Блоки Try & Catch используются для обнаружения некоторых ошибок в среде выполнения программного обеспечения. В качестве вашего вопроса вы делаете несколько кодов в блоке catch, потому что попытка всегда терпит неудачу. Это не стандарт. Всегда старайтесь создавать свой код в соответствии со стандартами кодирования.
Во-вторых, я видел в вашем коде папку с ресурсами внутри папки проекта, а не в файле lib.