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.

Другие вопросы по тегам