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

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列表实现原生列表效果,排版更灵活,还可添加边界判断避免数组下标越界崩溃:

  1. 新增方法生成内容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();
}
  1. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 05:54:05