#flutter
#flutter
Вопрос:
У меня есть пользовательский объект под названием item, который содержит такие параметры, как имя, описание, цена и т.д. Домашняя страница моего приложения представляет собой потоковую сборку объектов item (хранится в Firestore). Когда я нажимаю на элемент, это приводит меня на страницу сведений, и оттуда я могу нажать другую кнопку, чтобы отредактировать параметры элемента. При переходе с домашней страницы (список элементов) на страницу сведений об элементе я использую fromMap
для простого создания локального элемента из базы данных и передачи этого элемента на страницу сведений. Затем, если пользователь решит нажать кнопку редактирования, я передаю этот же элемент на страницу редактирования элемента (с уже заполненными параметрами элемента). Моя страница редактирования также содержит кнопку «Сохранить», которая сохранит обновленные параметры в Firestore.
Проблема, с которой я сталкиваюсь, заключается в том, что этот локальный элемент используется совместно между страницей сведений и страницей редактирования. Так, например, если я отредактирую название элемента и нажму кнопку «Назад», эти изменения будут отражены на странице сведений, хотя я на самом деле этого не хочу. Каков наилучший способ обработки этих изменений, более конкретно, обновления параметров элемента на странице сведений? Должен ли я добавить метод на странице сведений, который каждый раз, когда я захожу на эту страницу, обновляет страницу, извлекая самые последние данные из Firestore? Или при переходе с домашней страницы (список элементов) на страницу сведений передать идентификатор документа элемента и создать элемент на странице сведений?
Ответ №1:
Вы можете создать копию объекта item и вместо этого отредактировать копию, чтобы они не использовали одну и ту же ссылку.
В конце, когда вы хотите распространить изменение, вы можете просто установить значения вновь созданного экземпляра объекта на старое.
Например:
class EditItemDetailsPage extends StatefulWidget {
final Item item;
EditItemDetailsPage([this.item]);
@override
_EditItemDetailsPageState createState() => _EditItemDetailsPageState();
}
...
class _EditItemDetailsPageState extends State<EditItemDetailsPage> {
Item _itemCopy;
@override
void initState() {
super.initState();
// Make a copy of the instance you are editing
// An easy way to copy is to convert them into a map and back.
itemCopy = Item().fromMap(widget.item.toMap());
// Now your widgets here will edit _itemCopy instead of widget.item
}
void submit() {
// Send to firestore
bool success = sendToFirestore();
// Change were made to firestore successfully
if (success) {
// Apply change to original account instance.
widget.item.fromMap(_itemCopy.toMap());
}
}
}
Комментарии:
1. Прохладный. Я имел в виду что-то подобное, но я не был уверен, следует ли мне делать копию перед вызовом Navigator.push или внутри класса edit item. Я соглашусь с вашим решением