Flutter读取assets中CSV文件报错:文件路径不存在
排查解决步骤
1. 检查pubspec.yaml的assets配置(必做)
确认pubspec.yaml里的assets配置格式正确,Flutter对YAML缩进要求严格,必须用2个空格缩进:
flutter: assets: - assets/posts.csv # 单个文件配置 # 若要包含整个assets目录下的所有文件,可写:- assets/
注意:如果你的assets文件夹是放在lib目录下(比如lib/assets/posts.csv),配置路径要改成lib/assets/posts.csv,但更推荐把assets放在项目根目录(和lib同级),这是Flutter的标准目录结构。
2. 替换错误的文件读取方式(核心修复)
Flutter的assets是打包进应用资源包的,并非设备文件系统里的普通文件,所以File('assets/posts.csv')这种写法根本找不到文件,必须用Flutter提供的AssetBundle来读取。
正确实现代码
先导入依赖:
import 'package:flutter/services.dart'; import 'dart:convert';
推荐异步读取(避免阻塞UI)
Future<List<Post>> loadPosts() async { // 从assets读取CSV字符串 final csvContent = await rootBundle.loadString('assets/posts.csv'); // 按行分割内容 final lines = LineSplitter().convert(csvContent); return lines.map((line) { final parts = line.split(','); return Post( title: parts[0], numDownVotes: int.tryParse(parts[1]), numUpVotes: int.tryParse(parts[2]), ); }).toList(); }
同步读取(仅在非UI线程使用,不推荐)
List<Post> loadPostsSync() { final csvContent = rootBundle.loadStringSync('assets/posts.csv'); final lines = LineSplitter().convert(csvContent); return lines.map((line) { final parts = line.split(','); return Post( title: parts[0], numDownVotes: int.tryParse(parts[1]), numUpVotes: int.tryParse(parts[2]), ); }).toList(); }
3. 清理缓存重新构建
执行以下命令清理缓存,确保配置生效:
flutter clean flutter pub get flutter run
4. 额外检查项
- 文件名大小写:iOS系统区分文件名大小写,比如代码里写
posts.csv但实际文件是Posts.csv会报错。 - 文件实际存在:检查对应路径下确实有
posts.csv,没有拼写错误或路径层级错误。
内容的提问来源于stack exchange,提问作者QuintessentialGamer
相关产品推荐
相关产品推荐

