#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.