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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 18:25:18