将对象传递到编辑页面并维护更改

时间:2019-03-30 03:38:29

标签: flutter

我有一个名为item的自定义对象,其中包含诸如名称,描述,价格等参数。我的应用程序的主页是item对象的流生成器​​(存储在Firestore中)。当我单击一个项目时,它将带我到详细信息页面,然后从那里可以单击另一个按钮来编辑该项目的参数。从主页(项目列表)导航到项目详细信息页面时,我使用fromMap从数据库轻松创建本地项目并将该项目传递到详细信息页面。然后,如果用户决定单击编辑按钮,那么我会将同一项目传递到项目编辑页面(该项目的参数已经填写)。我的编辑页面还包含一个“保存”按钮,该按钮会将更新的参数保存到Firestore。

我面临的问题是该本地项正在详细信息页面和编辑页面之间共享。因此,例如,如果我编辑项目的名称并单击“后退”按钮,那么这些更改将反映在详细信息页面中,而我实际上并不希望这样做。处理这些更改的最佳方法是什么,更具体地说是在详细信息页面中更新item参数的?我是否应该在详细信息页面中添加一种方法,以便每次我进入此页面时,通过从Firestore中提取最新数据来刷新页面?或者,当从主页(项目列表)导航到详细信息页面时,传递项目的文档ID并在详细信息页面中创建项目吗?

1 个答案:

答案 0 :(得分:0)

您可以创建项目对象的副本,然后编辑副本,以使它们不共享相同的引用。

最后,当您要传播更改时,只需将新实例化的对象的值设置为旧对象即可。

例如:

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());
    }
  }
}