Как обновить состояние, когда пользователь что-то делает?

В моем коде пользователь может добавить DataRows к DataTable. Все DataRows сохраняются в списке. Этот список я использую в другом классе, где показываю данные списка. Проблема в том, что когда пользователь добавляет строку, пользовательский интерфейс не обновляется, поэтому пользователь не видит новую добавленную строку DataRow. Как я могу обновить пользовательский интерфейс после того, как пользователь добавит новый DataRow?

      class ExerciseTable extends StatefulWidget {
  ExerciseTable({Key key, this.title}) : super(key: key);
  final String title;

  @override
  _ExerciseTableState createState() => _ExerciseTableState();
}

class _ExerciseTableState extends State<ExerciseTable> {
  ExerciseDataSource _rowsDataSource;

  @override
  void initState() {
    _rowsDataSource = ExerciseDataSource(list: _rowList);
    super.initState();
  }

  List<DataRow> _rowList = [
    DataRow(cells: <DataCell>[
      DataCell(Datum(key: GlobalKey())),
      DataCell(ExerciseWidget(key: GlobalKey())),
      DataCell(ExerciseWidget(key: GlobalKey())),
      DataCell(ExerciseWidget(key: GlobalKey())),
      DataCell(ExerciseWidget(key: GlobalKey())),
      DataCell(ExerciseWidget(key: GlobalKey())),
      DataCell(ExerciseWidget(key: GlobalKey())),
      DataCell(Notes(key: GlobalKey())),
    ]),
  ];

class ExerciseDataSource extends DataTableSource {
  ExerciseDataSource({Key key, this.list});
  final List<DataRow> list;

  int _selectedCount = 0;

  @override
  int get rowCount => list.length;

  @override
  bool get isRowCountApproximate => false;

  @override
  int get selectedRowCount => _selectedCount;

  @override
  DataRow getRow(int index) {

    return DataRow.byIndex(
        index: index,
        cells: <DataCell>[
          DataCell(Datum(key: GlobalKey())),
          DataCell(ExerciseWidget(key: GlobalKey())),
          DataCell(ExerciseWidget(key: GlobalKey())),
          DataCell(ExerciseWidget(key: GlobalKey())),
          DataCell(ExerciseWidget(key: GlobalKey())),
          DataCell(ExerciseWidget(key: GlobalKey())),
          DataCell(ExerciseWidget(key: GlobalKey())),
          DataCell(Notes(key: GlobalKey())),
        ]);
  }
}

2 ответа

ЧТОБЫ обновлять пользовательский интерфейс, когда пользователь делает что-то, что вам следует использовать setState метод

для получения дополнительной информации проверьте setState

Во-первых, ваш пользователь должен инициировать событие. Например, у вас есть GestureDetector виджет .
Таким образом, вы можете, когда пользователь инициирует событие, позвонить setState:

Другие вопросы по тегам