Flutter中数组列表仅输出最后一项而非全部内容的问题求助
问题排查与修复方案
核心问题原因
- 你的
results方法中对result变量每次都使用赋值运算符=,每一行新的赋值都会直接覆盖之前的内容,所以最终仅返回最后一次赋值的Disk Expiry对应内容 - 重复调用
item.text.split('%')会产生不必要的性能开销,单次拆分后复用即可 - 若需要列表样式显示,拼接字符串的效果不如直接渲染Widget列表适配性好
最小改动修复方案(保留字符串返回逻辑)
修改results方法,将赋值改为追加拼接,同时加入换行符实现每行独立显示:
String results(){ // 单次拆分字符串复用 List<String> codeParts = item.text.split('%'); String result = ""; if(barcodeFormatEnumMap[item.barcodeFormat]! == 'PDF_417'){ // 使用+=追加内容,末尾加\n实现换行 result += "MVL code:" + codeParts[1] + "\n"; result += "Auth code:" + codeParts[2] + "\n"; result += "License Number:" + codeParts[3] + "\n"; result += "Issue Number:" + codeParts[4] + "\n"; result += "Disc Number:" + codeParts[5] + "\n"; result += "License Plate:" + codeParts[6] + "\n"; result += "Vehicle Registration:" + codeParts[7] + "\n"; result += "Vehicle Type:" + codeParts[8] + "\n"; result += "Make:" + codeParts[9] + "\n"; result += "Model:" + codeParts[10] + "\n"; result += "Colour:" + codeParts[11] + "\n"; result += "Vin Number:" + codeParts[12] + "\n"; result += "Engine Number:" + codeParts[13] + "\n"; result += "Disk Expiry:" + codeParts[14]; } else if (barcodeFormatEnumMap[item.barcodeFormat]! == 'CODE_128'){ result = "item code:" + item.text ; } return result; }
同时修改显示文本的Text组件,允许自动换行:
Text( results(), maxLines: null, )
更优方案(原生列表渲染)
直接返回Widget列表实现原生列表效果,排版更灵活,还可添加边界判断避免数组下标越界崩溃:
- 新增方法生成内容Widget列表
List<Widget> buildBarcodeItems() { List<Widget> items = []; if(barcodeFormatEnumMap[item.barcodeFormat]! == 'PDF_417'){ List<String> codeParts = item.text.split('%'); // 边界判断避免拆分后数组长度不足导致崩溃 if(codeParts.length >= 15) { items.add(Text("MVL code:${codeParts[1]}")); items.add(Text("Auth code:${codeParts[2]}")); items.add(Text("License Number:${codeParts[3]}")); items.add(Text("Issue Number:${codeParts[4]}")); items.add(Text("Disc Number:${codeParts[5]}")); items.add(Text("License Plate:${codeParts[6]}")); items.add(Text("Vehicle Registration:${codeParts[7]}")); items.add(Text("Vehicle Type:${codeParts[8]}")); items.add(Text("Make:${codeParts[9]}")); items.add(Text("Model:${codeParts[10]}")); items.add(Text("Colour:${codeParts[11]}")); items.add(Text("Vin Number:${codeParts[12]}")); items.add(Text("Engine Number:${codeParts[13]}")); items.add(Text("Disk Expiry:${codeParts[14]}")); } } else if (barcodeFormatEnumMap[item.barcodeFormat]! == 'CODE_128'){ items.add(Text("item code:${item.text}")); } // 统一加内边距 return items.map((e) => Padding(padding: const EdgeInsets.all(8.0), child: e)).toList(); }
- 修改build方法中的Column结构,插入生成的列表:
@override Widget build(BuildContext context) { return Card( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[ // 原有条码类型行保留 Row( children: [ Padding( padding: const EdgeInsets.all(8.0), child: Text("Barcode Type:", style: TextStyle(inherit: true, color: Colors.black), ), ), Padding( padding: const EdgeInsets.all(8.0), child: Text( barcodeFormatEnumMap[item.barcodeFormat]!, style: TextStyle(inherit: true, color: Colors.black), ), ), ], ), // 插入生成的内容列表 ...buildBarcodeItems(), ], ), ); }
内容的提问来源于stack exchange,提问作者neo
相关产品推荐
相关产品推荐

