Flutter使用blurhash_dart编码图片报文件不存在错误如何解决?
问题根源
你使用File类直接读取Flutter项目内的assets资源是错误的:Flutter项目内的静态资源在打包后会被封装到应用的专属资源包中,不存在本地文件系统的普通文件路径,所以会抛出找不到文件的报错。blurhash_dart官方示例中使用File读取的是设备本地存储的用户文件,不适用项目内置静态资源的场景。
正确实现方案
- 导入Flutter服务包,使用
rootBundle加载静态资源,同时将编码逻辑从build方法中移出(build方法会多次触发重绘,重复编码会造成不必要的性能损耗),建议放在initState中异步处理:
// 导入必要依赖 import 'package:flutter/services.dart'; import 'package:image/image.dart' as img; import 'package:blurhash_dart/blurhash_dart.dart'; // 在State类中实现异步加载逻辑 class _YourWidgetState extends State<YourWidget> { String? blurHashStr; @override void initState() { super.initState(); _generateBlurHash(); } Future<void> _generateBlurHash() async { // 替换为你的资源路径,和pubspec.yaml中声明的路径完全一致 final byteData = await rootBundle.load('assets/daytime/midday.jpg'); final fileBytes = byteData.buffer.asUint8List(); final img.Image? decodedImage = img.decodeImage(fileBytes); final blurHash = BlurHash.encode(decodedImage!, numCompX: 4, numCompY: 3); setState(() { blurHashStr = blurHash.hash; }); } @override Widget build(BuildContext context) { // 你的页面布局代码 } }
额外检查项
如果修改后仍有报错,请逐一确认以下配置:
pubspec.yaml中assets节点必须嵌套在flutter节点下,缩进严格为2个空格,每个资源路径前的-后需保留1个空格,路径缩进比assets多2个空格- 资源路径的大小写和实际文件、文件夹的大小写完全匹配(Android、Linux等平台文件系统大小写敏感,路径大小写不一致会触发报错)
- 修改
pubspec.yaml后必须执行flutter pub get,然后重启应用生效,热重载不会更新资源配置
内容的提问来源于stack exchange,提问作者Mohammed Bekele
相关产品推荐
相关产品推荐

