1. ホーム
  2. flutter

[解決済み] FlutterError: アセットをロードできない

2022-05-14 12:29:46

質問

これは私のアプリのフォルダ構造です

.idea
.vscode
android
build
fonts
 Oxygen-Bold.tff
 Oxygen-Light.tff
 Oxygen-Regular.tff
images
 pizza0.png
 pizza1.png
ios
lib
 ui
  home.dart
 main.dart
test
.gitignore
.metadata
.packages
app_widgets.iml
pubspec.lock
pubspec.yaml
README.md

私の pubspec.yaml ファイルでは、フォントとアセットを次のように読み込んでいます。

flutter:

uses-material-design: true

assets:
  - images/pizza0.png
  - images/pizza1.png

fonts:
  - family: Oxygen
    fonts:
      - asset: fonts/Oxygen-Regular.ttf
      - asset: fonts/Oxygen-Bold.ttf
        weight: 700
      - asset: fonts/Oxygen-Light.ttf
        weight: 300

これについては、特にエラーは出ていません。 pubspec.yaml を実行しても flutter packages get を実行すると、終了コード0が返されます。

私のhome.dartには以下のクラスがあります。

class PizzaImageWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    AssetImage pizzaAsset = AssetImage('images/pizza0.png');
    Image image = Image(image: pizzaAsset, width: 400, height: 400);
    return Container(
      child: image,
    );
  }
}

これは、画像を表示するために、他の場所で使用しています(コード省略)。

        ),
        PizzaImageWidget(),
      ],

ビルドではエラーは出ません。Flutter Doctor -vでもエラーは出ませんし、Flutter Analyze -vでもエラーは出ません。.apkは問題なくビルドできているようですが、スマホでアプリを開くとasset_bundle.dartで以下のエラーが発生します。

Exception has occurred. FlutterError (Unable to load asset: images/pizza0.png)

このエラーはasset_bundle.dartファイル内のこのクラスによって投げられます。

/// An [AssetBundle] that loads resources using platform messages.
class PlatformAssetBundle extends CachingAssetBundle {
  @override
  Future<ByteData> load(String key) async {
    final Uint8List encoded = utf8.encoder.convert(Uri(path: Uri.encodeFull(key)).path);
    final ByteData asset =
        await BinaryMessages.send('flutter/assets', encoded.buffer.asByteData());
    if (asset == null)
      throw FlutterError('Unable to load asset: $key');
    return asset;
  }
}

これはpizza0.pngファイルとpizza1.pngファイルの両方に対して起こります。Windows エクスプローラーと VS Code の両方で、ファイルはツリー構造で表示されます。フォント アセットは問題なく読み込まれます。

Flutter Run -v を実行したときに得られる出力です。

[+1068 ms] I/flutter ( 6489): ══╡ EXCEPTION CAUGHT BY IMAGE RESOURCE SERVICE ╞════════════════════════════════════════════════════ [ +9 ms] I/flutter ( 6489 ): 次のアサーションが投げられました。 画像コーデックを解決するために、次のアサーションがスローされました。[2 ミリ秒] I/flutter ( 6489 ): アセットを読み込むことができません。 images/pizza0.png [ +2 ms] I/flutter ( 6489): [1 ms] I/flutter(6489)。 6489): 例外が発生したときのスタックはこのようになっていました。[ +2 ms ]。 I/flutter ( 6489): #0 PlatformAssetBundle.load (package:flutter/src/services/asset_bundle.dart:221:7) [ +1 ms ]。 I/flutter ( 6489 ): [1 ms] I/flutter(6489)。 6489): #1 AssetBundleImageProvider._loadAsync (package:flutter/src/painting/image_provider.dart:429:44) [ +1 ms] です。 I/flutter ( 6489 ): [1 ms] I/flutter(6489)。 6489): #2 AssetBundleImageProvider.load (package:flutter/src/painting/image_provider.dart:414:14) [ +1 ms] です。 I/flutter ( 6489 ): #3 ImageProvider.resolve...。 (package:flutter/src/painting/image_provider.dart:267:86) [ +4 ms ]。 I/flutter ( 6489 ): #4 ImageCache.putIfAbsent (package:flutter/src/painting/image_cache.dart:143:20) [ +3 ms] を実行しました。 I/flutter ( 6489 ): #5 ImageProvider.resolve. (package:flutter/src/painting/image_provider.dart:267:63) [ +3 ms ]。 I/flutter ( 6489 ): (dart:asyncパッケージから8フレームを除外) [ +1 ms] I/flutter ( 6489 ): [1 ms] I/flutter ( 6489 ): 画像プロバイダ。 AssetImage(bundle: null, name: "images/pizza0.png") [ +3 ms ]。 I/flutter ( 6489 ): 画像キーです。AssetBundleImageKey(bundle: PlatformAssetBundle#20fc8(), name: "images/pizza0.png", [ +1 ms ]。 I/flutter ( 6489): scale: 1.0) [ +2 ms] I/flutter ( 6489): ════════════════════════════════════════════════════════════════════════════════════════════════════

どのように解決するのですか?

のインデントを考慮する必要があります。 assets

flutter:

  assets:
    - images/pizza1.png
    - images/pizza0.png

詳細はこちら

flutter:

[2 whitespaces or 1 tab]assets:
[4 whitespaces or 2 tabs]- images/pizza1.png
[4 whitespaces or 2 tabs]- images/pizza0.png