You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter pubspec配置正确仍无法加载PNG图片资源抛出异常求助

Flutter点击按钮切换图片时资源加载失败问题

这是我的图片目录

我正在开发一款应用,目标是点击FlatButton即可切换显示的图片。
以下是我的相关代码,当前图片无法加载,尽管我确认pubspec.yaml文件配置正确,运行时仍然抛出异常,希望得到大家的帮助。我的实现思路是在FlatButton的点击事件中调用随机函数,点击时更新展示的图片。

import 'package:flutter/material.dart';
import 'dart:math';
void main() {
  runApp(Magic());
}
class Magic extends StatefulWidget {
  const Magic({Key? key}) : super(key: key);
  @override
  _MagicState createState() => _MagicState();
}

class _MagicState extends State<Magic> {
  var i=1;
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home:Scaffold(
        backgroundColor:Colors.blue,
        appBar: AppBar(
          centerTitle: true,
          title:Text( 'Ask Me Anything',
          style: TextStyle(
              color: Colors.white,
          ),
          ),
          backgroundColor: Colors.blue[900],
        ),
        body: Container(
          child:FlatButton(
             onPressed: () {
               setState(() {
                 i = Random().nextInt(5)+1;
               });
             },
            child:Image(
            image:AssetImage('images/dice$i.png'),
            )
          ),
        ),
      )
    );
  }
}

我的Pubspec.yaml文件配置如下:

name: magicball
description: A new Flutter project.

# 以下配置避免当前私有包被误发布到pub.dev
publish_to: 'none' 

version: 1.0.0+1

environment:
  sdk: ">=2.12.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter
  cupertino_icons: ^1.0.2

dev_dependencies:
  flutter_test:
    sdk: flutter

flutter:
  uses-material-design: true
  assets:
    - images/ball1.png
    - images/ball2.png
    - images/ball3.png
    - images/ball4.png
    - images/ball5.png
    - images/dice1.png
    - images/dice2.png
    - images/dice3.png
    - images/dice4.png
    - images/dice5.png
    - images/dice6.png

报错信息如下:

The following assertion was thrown resolving an image codec:
Unable to load asset: images/dice4.png

When the exception was thrown, this was the stack: 
#0      PlatformAssetBundle.load (package:flutter/src/services/asset_bundle.dart:224:7)
<asynchronous suspension>
#1      AssetBundleImageProvider._loadAsync (package:flutter/src/painting/image_provider.dart:672:14)
<asynchronous suspension>
Image provider: AssetImage(bundle: null, name: "images/dice4.png")
Image key: AssetBundleImageKey(bundle: PlatformAssetBundle#70fe4(), name: "images/dice4.png", scale: 1.0)

解决方案

按以下顺序排查即可解决问题:

  • 先修正随机数范围:Random().nextInt(5)生成的是0到4的整数,加1后仅能得到1-5的取值,你配置的dice图片有1到6共6张,后续必然会出现无法加载dice6的问题,建议修改为i = Random().nextInt(6) + 1。
  • 检查pubspec.yaml缩进是否正确:yaml文件对缩进要求极其严格,assets字段必须在flutter字段下,保持2个空格的缩进,每个资源路径前的横杠也要保持统一的缩进,只要缩进有问题,就算路径写对了也无法识别资源。
  • 核对实际文件的文件名:Flutter的资源路径是大小写敏感的,如果你的实际文件名为Dice4.png或者dice4.PNG,和代码里写的dice4.png不一致,就会触发加载失败报错。
  • 清理缓存重新运行:修改资源配置或者替换资源文件后,不要只使用热重载,先执行flutter clean清理项目缓存,再重新启动项目,旧的缓存可能会导致新的资源配置不生效。

另外注意,FlatButton已经在新版Flutter中被弃用,建议替换为TextButton使用。


内容的提问来源于stack exchange,提问作者Karthik K Kumaraswamy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 20:39:02