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

Flutter中列表引用导致Accordion内所有Table数据重复如何解决?

解决方案

你遇到的问题本质是Dart的对象引用传递逻辑:Table的children属性直接持有你传入的linhas列表的引用,后续对linhas的修改(比如清空、新增元素)都会同步反映到已经创建的Table组件上。

有两种常用的修复方案:

方案1:创建Table时传入列表副本

给Table构造函数传值时,通过List.from()基于现有linhas创建一个独立的新列表,后续对原linhas的操作不会影响已经生成的Table数据。
仅需修改一行代码即可:

// 把原来的写法
Table tabelaNotas = Table(children: linhas);
// 替换为
Table tabelaNotas = Table(children: List.from(linhas));

修改后你原有逻辑里的linhas.clear()可以保留,不会丢失已添加的表格数据。

方案2:每次切换学科时创建新的行列表(更推荐)

不要复用同一个linhas对象,处理完单个学科的表格后直接给linhas赋值新的空列表,旧列表已经被Table持有,不会被后续操作修改。同时可以补上你原有代码的遗漏:循环结束后最后一个学科的表格没有加入列表的问题。
完整修改后代码如下:

PercEsc = await _iAlunoRepository.getPercEscolar(TurmaAtual);
accordionChildren.clear();
String discAtual = "";
List<TableRow> linhas = [];
for (PercEscModel percesc in PercEsc) {
  if (percesc.DS_DISCIPLINA_DIS != discAtual) {
    if (discAtual != "") {
      Table tabelaNotas = Table(children: linhas);
      var newItem = Accordion(discAtual, tabelaNotas);
      accordionChildren.add(newItem);
      // 不再清空原有列表,直接创建新的空列表给下一个学科使用
      linhas = [];
    }
    discAtual = percesc.DS_DISCIPLINA_DIS;
    linhas.add(const TableRow(children: [
      Text("Módulo", style: TextStyle(fontSize: 20.0)),
      Text("Designação", style: TextStyle(fontSize: 20.0)),
      Text("Nota", style: TextStyle(fontSize: 20.0))
    ]));
  }
  // 注意修正你原有代码的笔误:linha 改为 linhas
  linhas.add(TableRow(children: [
    Text(percesc.DS_ABREVUNID_ORG_UNO, style: TextStyle(fontSize: 11.0)),
    Text(percesc.DS_UNID_ORG_UNO, style: TextStyle(fontSize: 11.0)),
    Text(percesc.QT_NOTA_AVL.replaceAll(".00", ""),
        style: TextStyle(fontSize: 11.0))
  ]));
}
// 补充:把最后一个学科的表格加入列表
if (discAtual.isNotEmpty) {
  Table tabelaNotas = Table(children: linhas);
  accordionChildren.add(Accordion(discAtual, tabelaNotas));
}

方案2不需要额外做列表拷贝,性能更好,也更符合Dart的开发规范。


内容的提问来源于stack exchange,提问作者David Almeida

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:09:04