在 flutter datatable 的数据源中使用 getx 而不是有状态的小部件

use getx in flutter datatable's datasource instead of stateful widget

我尝试在flutter的Datatable DataSource中使用Getx动态更改rowCount,但是当我用obx包围它时它并没有改变。 如果我检查 ever(),数据源更改本身会被正确检测到,但屏幕由于某种原因没有更新。毕竟,我通过使用有状态的小部件成功地进行了动态更改,但是有谁知道如何使用 getx 做到这一点吗?

使用 getx:


class _MyDataTable extends StatelessWidget {
  _MyDataTable() {
    ever(dataSource, (_) => print("dataSource changed"));
  }
  final dataSource = _DataSource().obs;

  List<DataColumn> _dataColumList = [
    DataColumn(label: Icon(Icons.star)),
    DataColumn(label: Text("aaaa")),
    DataColumn(label: Text("bbbb")),
    DataColumn(label: Text("cccc")),
    DataColumn(label: Text("dddd")),
  ];
  @override
  Widget build(BuildContext context) {
    return SingleChildScrollView(
        child: Column(
      children: [
        SizedBox(
            width: double.infinity,
            child: Obx(() => PaginatedDataTable(
                rowsPerPage: 50,
                columns: [
                  for (var i in _selectedIndexs) _dataColumList[i],
                ],
                source: dataSource.value))),//change of dataSource will not update view.
        ElevatedButton(
            onPressed: () {
              // dataSource.value.changeRowCount();
              dataSource.update((dataSource) {
                dataSource!._rowCount++;
              });
            },
            child: Obx(() => Text(
                "change row count"))),
      ],
    ));
  }
}

class _DataSource extends DataTableSource {
  int _rowCount = 50;

  @override
  DataRow getRow(int index) {
    List<DataCell> dataCellList = [
      DataCell(
         .........
      )),
    ];

    /// 1行文のデータ
    return DataRow(cells: [
      for (var i in _selectedIndexs) dataCellList[i],
    ]);
  }

  @override
  int get rowCount => _rowCount;
  @override
  bool get isRowCountApproximate => false; 
  @override
  int get selectedRowCount => 0;
}

有状态的小部件(正常工作)



class _MyDataTableState extends State<MyDataTable> {
  final GlobalController global = Get.find();
  var dataSource = new _DataSource();

  List<DataColumn> _dataColumList = [
    DataColumn(label: Icon(Icons.star)),
    DataColumn(label: Text("aaaa")),
    DataColumn(label: Text("bbbb")),
    DataColumn(label: Text("cccc")),
    DataColumn(label: Text("dddd")),
  ];

  @override
  Widget build(BuildContext context) {
    return Obx(() => SingleChildScrollView(
            child: Column(
          children: [
            SizedBox(
                width: double.infinity,
                child: PaginatedDataTable(
                    rowsPerPage: 50,
                    columns: [
                      for (var i in _selectedIndexs) _dataColumList[i],
                    ],
                    source: dataSource)),
            MaterialButton(
              onPressed: () {
                setState(() {
                  dataSource.changeRowCount();
                });
              },
              child: Text(
                'change row count',
              ),
            ),
          ],
        )));
  }
}

class _DataSource extends DataTableSource {
  int _rowCount = 50;
  void changeRowCount() {
    _rowCount++;
    notifyListeners();
  }

  @override
  DataRow getRow(int index) {
    List<DataCell> dataCellList = [
      DataCell(
         .........
      )),
    ];

    /// 1行文のデータ
    return DataRow(cells: [
      for (var i in _selectedIndexs) dataCellList[i],
    ]);
  }

  @override
  int get rowCount => _rowCount;
  @override
  bool get isRowCountApproximate => false; 
  @override
  int get selectedRowCount => 0;
}



在您的“ElevatedButton”上:

onPressed: () {
          dataSource._rowCount++;
          var ds = dataSource;
          dataSource.value = ds;
        },

最后,我通过这样做成功更新了视图:


      var newDataSource = _DataSource();
      newDataSource._rowCount = 100;
      dataSource.value = newDataSource;