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

