Передача объекта на страницу редактирования и сохранение изменений

#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. Я соглашусь с вашим решением