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

Flutter中PaginatedDataTable2复选框无法勾选的问题求助

PaginatedDataTable2复选框无法勾选的解决办法

你的问题出在这几个核心点:

  • 所有行共用同一个isChecked变量,点任何一行的复选框都会修改这个全局变量,导致状态混乱
  • 修改选中状态后没有通知数据源刷新,UI无法同步更新
  • DataRow没有绑定选中状态,复选框不知道自己该显示选中还是未选中

修复步骤:

  1. 给每条数据添加独立的选中状态
    调整数据生成逻辑,让每条数据自带selected字段,确保每行的选中状态互不干扰:

    final List<Map<String, dynamic>> _data = List.generate(
      200,
      (index) => {
        "title": "Meyve",
        "price": " ",
        "kilo": " ",
        "selected": false, // 新增选中状态字段
      });
    
  2. 修改MyData类的核心逻辑
    去掉全局的isChecked,改用当前行数据的selected状态,修改后调用notifyListeners()通知数据源刷新UI:

    class MyData extends DataTableSource {
      final List<Map<String, dynamic>> _data = List.generate(
        200,
        (index) => {
          "title": "Meyve",
          "price": " ",
          "kilo": " ",
          "selected": false,
        });
    
      @override
      DataRow? getRow(int index) {
        final rowData = _data[index];
        return DataRow(
          selected: rowData["selected"], // 绑定选中状态到复选框
          onSelectChanged: (bool? value) {
            if (value == null) return;
            // 更新当前行的选中状态
            rowData["selected"] = value;
            // 通知数据源刷新,触发UI更新
            notifyListeners();
          },
          cells: [
            DataCell(Text(rowData["title"])),
            DataCell(TextFormField(
              decoration: InputDecoration(label: Text('fiyat')),
            )),
            DataCell(TextFormField(
              decoration: InputDecoration(label: Text('kilo')),
            )),
          ]);
      }
    
      // 必须实现DataTableSource的其他必填方法
      @override
      bool get isRowCountApproximate => false;
    
      @override
      int get rowCount => _data.length;
    
      @override
      int get selectedRowCount => _data.where((row) => row["selected"]).length;
    }
    
  3. 在State中管理数据源实例
    在main.dart的页面State类里初始化MyData实例,确保状态更新能正确传递到UI:

    class _YourPageState extends State<YourPage> {
      late MyData _data;
    
      @override
      void initState() {
        super.initState();
        _data = MyData();
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          // ...其他页面代码
          body: Container(
            child: Padding(
              padding: const EdgeInsets.fromLTRB(5, 0, 5, 75),
              child: PaginatedDataTable2(
                header: const Center(child: Text('Ürünler')),
                showCheckboxColumn: true,
                checkboxHorizontalMargin: 10,
                rowsPerPage: 8,
                source: _data,
                columns: [
                  DataColumn(label: Text('Stok Adı')),
                  DataColumn(label: Text('Price')),
                  DataColumn(label: Text('Price')),
                ],
              ),
            ),
          ),
        );
      }
    }
    

完成以上修改后,每行的复选框就能独立勾选,状态变化也会实时同步到UI上。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 08:11:38