FlutterError:无法加载资产

Mat*_*ias 18 assets flutter

这是我的应用程序的文件夹结构

.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
Run Code Online (Sandbox Code Playgroud)

在我的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
Run Code Online (Sandbox Code Playgroud)

我没有收到此yaml文件的任何错误,并且运行“ flutter package 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,
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

我在其他地方使用的是为了显示图像(省略了代码):

        ),
        PizzaImageWidget(),
      ],
Run Code Online (Sandbox Code Playgroud)

建立没有错误。Flutter Doctor -v没有给出任何错误,Flutter Analyze -v也没有给出任何错误。.apk似乎可以很好地构建,但是当应用程序在手机上打开时,在asset_bundle.dart中出现以下错误:

发生异常。FlutterError(无法加载资源: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;
  }
}
Run Code Online (Sandbox Code Playgroud)

Pizza0.png文件和pizza1.png文件都会发生这种情况。这些文件在树结构中都是可见的,在Windows资源管理器中都与VS Code中一样。字体资产加载没有问题。

这是运行Flutter Run -v时得到的输出:

[+1068毫秒] I /颤振(6489):??? 影像资源服务的例外情况??????????????????????????????????????????????????? ????????? [+9 ms] I / flutter(6489):抛出了以下断言来解析图像编解码器:[+2 ms] I / flutter(6489):无法加载资产:images / pizza0.png [+2 ms] I / flutter(6489):[+1 ms] I / flutter(6489):引发异常时,这是堆栈:[+2 ms] I / flutter(6489):#0 PlatformAssetBundle.load(package:flutter /src/services/asset_bundle.dart:221:7)[+1毫秒] I / flutter(6489):[+1毫秒] I / flutter(6489):#1 AssetBundleImageProvider._loadAsync(package:flutter / src / painting /image_provider.dart:429:44)[+1 ms] I / flutter(6489):[+1 ms] I / flutter(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毫秒] I / flutter(6489):图片提供者:AssetImage(bundle:null,名称:“ images / pizza0.png”)[+3毫秒] I / flutter(6489):图片密钥:AssetBundleImageKey(bundle :PlatformAssetBundle#20fc8(),名称:“ images / pizza0.png”,[+1毫秒] I / Flutter(6489):比例尺:1.0)[+2毫秒] I / flutter(6489):

die*_*per 30

您应该考虑缩进 assets

flutter:

  assets:
    - images/pizza1.png
    - images/pizza0.png
Run Code Online (Sandbox Code Playgroud)

更多细节:

flutter:

[2 whitespaces or 1 tab]assets:
[4 whitespaces or 2 tabs]- images/pizza1.png
[4 whitespaces or 2 tabs]- images/pizza0.png
Run Code Online (Sandbox Code Playgroud)

  • 事实证明,这里的罪魁祸首是“使用材料设计:真实”。注释掉该部分,或更改该部分的外观使它起作用。看起来像一个怪异的疏忽/错误,字体可以正常工作,但资产却不能。 (4认同)
  • 资产前的 2 个空格(或 1 个制表符)和之前的 4 个空格(或 2 个制表符) - 图像... (2认同)

Dee*_*Jha 20

为了我,

  1. flutter clean,
  2. 重启android studio和模拟器​​,
  3. 在我的形象中给出完整的路径

    image: AssetImage(
      './lib/graphics/logo2.png'
       ),
       width: 200,
       height: 200,
     );
    
    Run Code Online (Sandbox Code Playgroud)

这三个步骤成功了。


Ale*_*ean 18

遇到相同的问题,代码略有不同。就我而言,我使用了一个“资产”文件夹,该文件夹细分为资产(精灵、音频、UI)子文件夹。

我的代码最初只是在pubspec.yaml 中- 替代方法是详细说明每个文件。

flutter:

  assets:
    - assets

Run Code Online (Sandbox Code Playgroud)

压痕和颤振清洁不足以修复它。flutter 未加载子文件夹的文件。似乎 flutter 需要“用手”,而不是在没有明确要求它查看子文件夹的情况下查看它们。这对我有用:

flutter:

  assets:
    - assets/sprites/
    - assets/audio/
    - assets/UI/

Run Code Online (Sandbox Code Playgroud)

所以我必须详细说明每个文件夹和每个包含资产(mp3、jpg 等)的子文件夹。这样做使应用程序工作并为我节省了大量时间,因为上面详述的唯一解决方案需要我手动列出 30 多个资产,而这里的代码只有几行并且更易于维护。

  • 顺便说一句 - 如果您在 dart 文件小部件中使用 plyer.play('assets/audio/sound.mp3') 等代码,则有些包(例如 audioplayers)将无法正确加载资源。虽然 plyer.play('audio/sound.mp3') 将正确加载。这也会造成一些非常令人沮丧的调试。所以我想添加它。 (4认同)

小智 12

有时缓存会产生问题,所以首先运行

flutter clean
Run Code Online (Sandbox Code Playgroud)

这次运行之后

flutter pub get
Run Code Online (Sandbox Code Playgroud)


yat*_*van 11

我有同样的问题。我刚跑步"$ flutter clean",一切都OK。

有关此错误的更多信息

  • 在 Android Studio 中,就我而言,只有在使用热重载时才会出现此问题。通过按“停止”按钮触发重建,然后按“播放”按钮解决了这个问题(我正在使用集成的 Android 模拟器) (3认同)
  • 谢谢。这是我的问题。其实我也有错误的缩进。所以人们应该检查他们的缩进并且运行“干净”。 (2认同)
  • 运行“flutter clean”后重新启动 Android Studio。为我工作。 (2认同)

Jam*_*len 10

我也有这个问题。我认为 Flutter 缓存图像的方式存在错误。我的猜测是,当您第一次尝试加载时pizza0.png,它不可用,并且 Flutter 已经缓存了这个失败的结果。然后,即使添加了正确的图像,Flutter 仍然认为它不可用。

这都是猜测,基于我遇到同样问题的事实,并且在应用程序启动时调用一次为我解决了问题:

imageCache.clear();
Run Code Online (Sandbox Code Playgroud)

这会清除图像缓存,这意味着 Flutter 将尝试加载新鲜图像而不是搜索缓存。

PS 我还发现,出于同样的原因,每当您更改任何现有图像时都需要调用它 - Flutter 将加载旧的缓存版本。另一种方法是重命名图像。


小智 9

如果您正在开发 flutter 包,请在图像路径后添加包参数,如下所示:

AssetImage('images/heart.png', package: 'my_icons') // my_icons is your plugin name, in flutter plugin is also a package.
Run Code Online (Sandbox Code Playgroud)

这是 flutter 文档的链接 https://flutter.dev/assets-and-images/#from-packages


Mah*_*177 8

在 pubspec.yaml 中,不要使用 TAB!

flutter:
<space><space>assets:
<space><space><space><space>assets/
Run Code Online (Sandbox Code Playgroud)

例子:

flutter:
  assets:
    assets/
Run Code Online (Sandbox Code Playgroud)


gen*_*ser 8

就我而言,重新启动没有帮助。

我必须卸载该应用程序,然后再次运行所有内容

它确实有效!


mah*_*mnj 7

您只需指定图像文件夹的路径即可,而不必指定每个图像。
确保您使用正确的缩进,因为pubspec.yaml是缩进敏感的。

flutter:

  uses-material-design: true
  assets:
    - images/
Run Code Online (Sandbox Code Playgroud)

您可以简单地访问每个图像为

  new Image.asset('images/pizza1.png',width:300,height:100)
Run Code Online (Sandbox Code Playgroud)

  • 最佳答案, 不需要添加文件名。 (4认同)

小智 7

我有一个类似的问题,我在这里修复:

uses-material-design: true
 assets:
   - assets/images/
Run Code Online (Sandbox Code Playgroud)

之后,执行以下操作:

Flutter Clean
Run Code Online (Sandbox Code Playgroud)


小智 6

我只是重新运行我的应用程序,而不仅仅是热重新加载。


YMG*_*YMG 6

完成所有操作后仍然无法正常工作,请尝试:

flutter clean
flutter pub get
Run Code Online (Sandbox Code Playgroud)

有时更新pubspec.yaml文件后,尽管显示正在运行,但无法运行 pub get。

尝试上面的命令


Ume*_*qas 5

实际上问题出在 pubspec.yaml 中,我将所有图像都放入 assets/images/

这个错误的方式

flutter:
  uses-material-design: true
  assets:
  - images/
Run Code Online (Sandbox Code Playgroud)

正确的

flutter:
  uses-material-design: true
  assets:
  - assets/images/
Run Code Online (Sandbox Code Playgroud)


小智 5

  1. 你应该以资产词开始图像路径:

image: AssetImage('assets/images/pizza0.png')

  1. 您必须在 pubspec.yaml 中的新行中添加每个子文件夹


Nea*_*ail 5

对我来说唯一有用的是在代码中提及整个路径。也就是说,您必须在代码页上提及根目录中的图像路径,在 YAML 中它与顶级目录一起使用。

您可能无法仅使用代码中的主目录路径,我已经尝试了很多,这是唯一有效的方法。

希望它能解决问题并节省您的时间。

第一个图像是代码,第二个图像是 yaml。

代码

yaml