#flutter #dart #flutter-state
#flutter #dart #состояние flutter
Вопрос:
Я пытаюсь обновить объект в Flutter из дочернего виджета. Объект, который я хочу обновить, был передан дочернему объекту как параметр. Проблема: объект не хочет меняться. Я работаю над виджетом с отслеживанием состояния и обновляю состояние setState
, но ничего не меняется. Возможно, вы можете найти ошибку в моем коде.
Мой объект
final guestbook = Guestbook({
title: "Test"
// ... some other parameters
})
Функция, в которой я передаю Guestbook
объект дочернему виджету
void _editGuestbook(Guestbook guestbook, BuildContext context) {
CupertinoScaffold.showCupertinoModalBottomSheet(
context: context,
builder: (BuildContext context, ScrollController scrollController) {
return EditGuestbook(
guestbook: guestbook, // Here I pass the object to the child
scrollController: scrollController,
);
}).then((value) {
setState(() {
guestbook = value;
});
});
}
В следующем виджете я обновляю некоторые значения в базе данных и хочу также изменить свой локальный объект, чтобы пользователь мог видеть, что обновление прошло успешно. Поэтому я передаю объект с обновленными значениями в качестве аргумента обратно в родительское представление.
final Guestbook guestbook;
......
........
// Update database
final gb = widget.guestbook;
setState(() {
updatedGuestbook = Guestbook(
title: "New title",
// ... some other parameters
});
await GuestbooksDatabase()
.updateGuestbook(guestbook: updatedGuestbook, key: gb.id)
.then((_) {
Get.back(result: updatedGuestbook); // Here I send data back to parent
});
И, как вы можете видеть выше, после извлечения нового объекта я обновляю состояние с помощью setState
:
setState(() {
guestbook = value;
});
Бот ничего не меняет в представлении. Я всегда вижу старое состояние. Если я нажму на обновление, чтобы загрузить новые записи непосредственно из базы данных, она обновляется. Есть ли способ просто обновить локальный объект, чтобы мне не требовался дополнительный запрос к серверу?
Комментарии:
1. конечные поля не могут быть изменены. и в качестве параметров метода вы отправляете копию объекта, а не реальный объект. Таким образом, это не окажет никакого влияния на переменные класса
2. Что вы могли бы сделать, это передать функцию обратного вызова вашему дочернему виджету от вашего родителя, которая устанавливает гостевую книгу в родительском виджете, затем дочерний виджет будет создан снова по мере изменения гостевой книги в родительском виджете.