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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 04:57:16