Flutter使用flutter_expandable_table添加行不显示,求排查解决
解决flutter_expandable_table动态添加行不生效的问题
核心修复要点
- 确保
ExpandableTableController绑定的是可变数据源列表,不能使用一次性创建的不可变List - 添加新行时,先修改数据源列表,再调用
controller.notifyListeners(),同时配合setState触发UI刷新 - 全程复用同一个controller实例,不要在添加行时重新创建
可运行修复示例代码
import 'package:flutter/material.dart'; import 'package:flutter_expandable_table/flutter_expandable_table.dart'; class ExpandableTableDemo extends StatefulWidget { const ExpandableTableDemo({super.key}); @override State<ExpandableTableDemo> createState() => _ExpandableTableDemoState(); } class _ExpandableTableDemoState extends State<ExpandableTableDemo> { late ExpandableTableController _tableController; // 用可变List存储行数据,controller将监听此列表变化 final List<ExpandableTableRow> _tableRows = []; @override void initState() { super.initState(); // 初始化默认行 _addDefaultRows(); // 将可变列表传入controller _tableController = ExpandableTableController(rows: _tableRows); } void _addDefaultRows() { _tableRows.addAll([ ExpandableTableRow( cells: [ ExpandableTableCell(child: const Text('默认行1-列1')), ExpandableTableCell(child: const Text('默认行1-列2')), ], ), ExpandableTableRow( cells: [ ExpandableTableCell(child: const Text('默认行2-列1')), ExpandableTableCell(child: const Text('默认行2-列2')), ], ), ]); } // 点击添加行的逻辑 void _onAddRowPressed() { setState(() { // 直接向可变列表中添加新行 _tableRows.add(ExpandableTableRow( cells: [ ExpandableTableCell(child: Text('新增行${_tableRows.length+1}-列1')), ExpandableTableCell(child: Text('新增行${_tableRows.length+1}-列2')), ], )); // 通知controller数据源更新,触发表格内部刷新 _tableController.notifyListeners(); }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('动态添加行示例')), body: Column( children: [ Padding( padding: const EdgeInsets.all(16.0), child: ElevatedButton( onPressed: _onAddRowPressed, child: const Text('添加新行'), ), ), Expanded( child: ExpandableTable( controller: _tableController, // 定义表格表头 headers: const [ ExpandableTableHeader(child: Text('第一列')), ExpandableTableHeader(child: Text('第二列')), ], ), ), ], ), ); } }
关键注意事项
- 禁止在添加行时重新创建
ExpandableTableController,必须复用初始化时绑定了可变列表的实例 - 数据源列表必须保持可变(即修改列表内容而非重新赋值新列表),否则controller无法感知变化
setState与controller.notifyListeners()需配合使用:前者刷新Flutter Widget树,后者通知表格组件同步内部状态
内容的提问来源于stack exchange,提问作者Sam Quintanar
相关产品推荐
相关产品推荐

