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
相关产品推荐
相关产品推荐

