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

Flutter构建Myntra风格应用时CSV数据加载失败的求助

问题分析

报错Error loading CSV data: RangeError (index): Index out of range: index should be less than 1: 1的核心原因是:处理CSV行时,某一行的列数不足14列(你的Product模型需要14个字段对应csvRow[0]到csvRow[13]),或者CSV文件格式错误、加载后出现空行,导致访问索引时越界。

解决方案

1. 校验CSV行的列数,跳过无效行

修改_loadCsvData方法中的循环逻辑,在转换为Product对象前先检查行的列数是否符合要求,避免直接访问越界索引:

Future<void> _loadCsvData() async {
  try {
    final csvString = await rootBundle.loadString('assets/myntra_fashion6.csv');
    List<List<dynamic>> csvTable = CsvToListConverter().convert(csvString);

    if (csvTable.isNotEmpty) {
      print('CSV Table Headers: ${csvTable[0]}');
    }

    List<Product> products = [];
    for (var i = 1; i < csvTable.length; i++) {
      final row = csvTable[i];
      // 检查当前行是否有足够的列数(至少14列)
      if (row.length >= 14) {
        print('CSV Row $i: $row');
        products.add(Product.fromCsv(row));
      } else {
        print('跳过无效行 $i: 列数不足 (实际${row.length}/需要14)');
      }
    }

    setState(() {
      _products = products;
      _filteredProducts = products;
      _isLoading = false;
    });
  } catch (e) {
    print("Error loading CSV data: $e");
    // 加载失败时也要停止加载状态,避免一直显示加载指示器
    setState(() {
      _isLoading = false;
    });
  }
}

2. 检查并修正CSV文件格式

  • 确认CSV文件的分隔符:默认CsvToListConverter使用逗号作为分隔符,如果你的CSV用的是其他分隔符(比如制表符\t),需要显式指定:
List<List<dynamic>> csvTable = CsvToListConverter(fieldDelimiter: ',').convert(csvString);
  • 手动打开CSV文件,检查是否存在空行、格式错乱的行,或者表头与数据行的列数不匹配的情况,修正这些无效内容。

3. 为字段解析添加容错处理

在Product.fromCsv工厂方法中,使用tryParse替代parse,并为每个字段设置默认值,避免单个字段解析失败导致整个加载流程中断:

factory Product.fromCsv(List<dynamic> csvRow) {
  return Product(
    url: csvRow[0]?.toString() ?? '',
    productId: int.tryParse(csvRow[1]?.toString() ?? '') ?? 0,
    brandName: csvRow[2]?.toString() ?? '',
    category: csvRow[3]?.toString() ?? '',
    individualCategory: csvRow[4]?.toString() ?? '',
    categoryByGender: csvRow[5]?.toString() ?? '',
    description: csvRow[6]?.toString() ?? '',
    discountPrice: double.tryParse(csvRow[7]?.toString() ?? '') ?? 0.0,
    originalPrice: double.tryParse(csvRow[8]?.toString() ?? '') ?? 0.0,
    discountOffer: int.tryParse(csvRow[9]?.toString() ?? '') ?? 0,
    sizeOption: csvRow[10]?.toString() ?? '',
    ratings: double.tryParse(csvRow[11]?.toString() ?? '') ?? 0.0,
    reviews: int.tryParse(csvRow[12]?.toString() ?? '') ?? 0,
    standardizedSize: csvRow[13]?.toString() ?? '',
  );
}

4. 确认CSV文件的资源配置

检查pubspec.yaml中是否正确声明了CSV资源,确保文件能被正确加载:

flutter:
  assets:
    - assets/myntra_fashion6.csv

内容的提问来源于stack exchange,提问作者Riya Birnale

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 23:35:54