我有一个名为item的自定义对象,其中包含诸如名称,描述,价格等参数。我的应用程序的主页是item对象的流生成器(存储在Firestore中)。当我单击一个项目时,它将带我到详细信息页面,然后从那里可以单击另一个按钮来编辑该项目的参数。从主页(项目列表)导航到项目详细信息页面时,我使用fromMap
从数据库轻松创建本地项目并将该项目传递到详细信息页面。然后,如果用户决定单击编辑按钮,那么我会将同一项目传递到项目编辑页面(该项目的参数已经填写)。我的编辑页面还包含一个“保存”按钮,该按钮会将更新的参数保存到Firestore。
我面临的问题是该本地项正在详细信息页面和编辑页面之间共享。因此,例如,如果我编辑项目的名称并单击“后退”按钮,那么这些更改将反映在详细信息页面中,而我实际上并不希望这样做。处理这些更改的最佳方法是什么,更具体地说是在详细信息页面中更新item参数的?我是否应该在详细信息页面中添加一种方法,以便每次我进入此页面时,通过从Firestore中提取最新数据来刷新页面?或者,当从主页(项目列表)导航到详细信息页面时,传递项目的文档ID并在详细信息页面中创建项目吗?
答案 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());
}
}
}