Flutter中AssetImage正常加载资源但rootBundle.load报错无法加载资产
问题原因
你遇到的这个报错核心是AssetImage和rootBundle.load的资源查找逻辑不一致:
AssetImage会自动匹配设备像素密度、主题对应的资源变体,比如你仅在assets/imgs/2.0x/、assets/imgs/3.0x/目录下放了对应图片,根目录没放,AssetImage也能自动找到对应分辨率的文件正常加载。rootBundle.load是完全按照传入的路径做精确匹配查找,不会自动处理资源变体,如果对应路径下没有直接存放目标文件就会抛出加载失败异常。
另外还有两个常见触发场景:
- 资源路径大小写拼写不一致:Windows开发环境大小写不敏感,
AssetImage可以正常加载大小写不匹配的资源,打包后或者在大小写敏感的iOS/Android系统上,rootBundle.load就会找不到文件。 - 资源缓存异常:热重载过程中产生的资源缓存也可能偶发导致路径识别错误。
解决方案
- 方案1:需要和
AssetImage逻辑一致读取匹配当前设备的资源时,优先通过AssetImage的obtainKey方法获取实际资源路径再加载:
ImageConfiguration config = ImageConfiguration(size: Size(60.w, 20.w)); AssetImage image = AssetImage('assets/imgs/indicator_tab.png'); AssetBundleImageKey key = await image.obtainKey(config); ByteData byteData = await key.bundle.load(key.name);
- 方案2:需要读取根目录原始资源时,确认
assets/imgs/目录下直接存放了indicator_tab.png文件,而不是仅存放在分辨率子目录中,同时检查路径拼写、大小写和实际文件、pubspec.yaml中的资源配置完全一致。 - 方案3:偶发的缓存问题可以先清除资源缓存再尝试加载:
rootBundle.evict("assets/imgs/indicator_tab.png"); await rootBundle.load("assets/imgs/indicator_tab.png");
内容的提问来源于stack exchange,提问作者hs johnny
相关产品推荐
相关产品推荐

