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
相关产品推荐
相关产品推荐

