Значение раскрывающейся кнопки Flutter не меняется после выбора нового значения

#flutter #dart #amazon-dynamodb #aws-amplify #flutter-aws-amplify

Вопрос:

Я пытался создать внешний пользовательский интерфейс, который пользователь может использовать для внесения определенных изменений в базу данных(dynamodb) в облаке. Когда я выбираю новое значение, я хочу, чтобы оно отображало изменение, которое хочет внести пользователь, без фактического изменения базы данных. Изменения сохраняются только тогда, когда я нажимаю кнопку на панели приложений. Кроме того, когда я использую setState для восстановления кнопки, значение не меняется в облаке, а также изменяется значение для всех кнопок в столбце(отлично работает без setState). Предоставленный мной код изменяет базу данных при нажатии значка сохранить, но значение раскрывающейся кнопки остается прежним, если я не обновлю страницу. Я приношу извинения, если недостаточно четко объяснил свою проблему, это моя первая публикация в Stackoverflow, и я все еще изучаю, как работать с flutter и aws amplify.

 body: InteractiveViewer(
    constrained: false,
    child: DataTable(
        columns: [
          DataColumn(label: Text('Apt #')),
          DataColumn(label: Text('Type')),
          DataColumn(label: Text('Availability')),
          DataColumn(label: Text('Price')),
          DataColumn(label: Text('Area'))
        ],
        rows: aprts.map<DataRow>((element) { //aprts is a list that contains apartment objects.
          return DataRow(cells: [
            DataCell(Text(element.aptNum.toString())),
            DataCell(Text(element.type)),
            DataCell(DropdownButton<String>( /// this is the part im having problems wi
              value: element.availabily, // gets the value for the availability attribute for the element and stores it into value.
              onChanged: (String newValue) {
                availValue = newValue; //stores the newValue in a global variable that is used in a function that is used toactually make changes to the database.
                tempAvail = element;
                
              },
              items: <String>['AVAILABLE', 'SOLD', 'RESERVED']
                  .map((String value) {
                return DropdownMenuItem<String>(
                  value: value,
                  child: Text(value),
                );
              }).toList(),
            )), // end of problem. 
            DataCell(TextField(
              controller: TextEditingController()
                ..text = element.price.toString(),
              onChanged: (text) {
                aptPrice = text;
                tempPrice = element;
              },
            )),
            DataCell(TextField(
              controller: TextEditingController()..text = element.area,
              onChanged: (text) {
                aptArea = text; 
                tempArea = element;
              },
            )),
          ]);
        }).toList()),
  ),
 

Как выглядит приложение. После нажатия кнопки

Комментарии:

1. Используйте setState(() =>) при установке значения

2. Если я использую setState, внесенные мной изменения не сохраняются в базе данных.

Ответ №1:

Воспользуйся

 onChanged: (String newValue) {
                setState(() {
                   availValue = newValue; 
                   tempAvail = element;
                  }
                 )
                },
 

потому что для каждого изменения пользовательского интерфейса вы должны вызывать setState((){})

Комментарии:

1. Я пробовал это, и это вызывает 2 проблемы. 1. он изменяет значения всех раскрывающихся кнопок, а не только выбранных 1. 2. Он не вносит никаких изменений в dynamodb.

2. Попробуйте использовать пакет поставщика из pub.dev и использовать Consumer вместо setState.