#flutter #dart #flutter-getx #statefulwidget
Вопрос:
Я попытался динамически изменить количество строк, используя Getx в Datatable источнике данных flutter, но он не изменился, когда я окружил его 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;
}
Ответ №1:
На вашей «поднятой кнопке»:
onPressed: () {
dataSource._rowCount ;
var ds = dataSource;
dataSource.value = ds;
},
Комментарии:
1. Я попробовал, но на самом деле это не изменило значение, поэтому getX проигнорировал изменение и не обновил представление
Ответ №2:
В конце концов, мне удалось обновить представление, сделав это:
var newDataSource = _DataSource();
newDataSource._rowCount = 100;
dataSource.value = newDataSource;