Flutter Provider添加Map至List时元素被覆盖的问题解决
Flutter Provider+Firestore数据添加时列表元素被覆盖的问题解决
问题原因
- Map引用共享:你在Provider中维护的
inventorySellerData是同一个Map对象的引用,每次调用getInvSellerData只是修改这个Map内部的键值对,而非创建新的Map实例。当你把这个Map添加到本地列表时,列表里存的都是同一个Map的引用,后续修改这个Map会同步影响列表里所有已添加的元素,导致所有元素看起来都是最新的那组数据。
解决方法
1. 在Provider中每次生成新的Map实例
修改inv_provider.dart里的getInvSellerData方法,每次获取数据时创建新的Map对象替换原有引用:
// 修改后的getInvSellerData方法 void getInvSellerData(DocumentSnapshot doc) { // 创建全新的Map实例,不再复用旧引用 inventorySellerData = { 'sellerDate1': doc['date'], 'sellerQty1': doc['qty'], }; // 通知UI更新(如果需要) notifyListeners(); }
2. 添加到本地列表时创建Map副本
如果暂时无法修改Provider的逻辑,也可以在添加到本地列表时,对当前inventorySellerData做浅拷贝(对于简单键值对的Map足够):
// 在调用add的地方修改为: localList.add(Map.from(inventorySellerData)); // 或者用扩展运算符简化: localList.add({...inventorySellerData});
验证效果
完成上述修改后,两次点击ASSIGN按钮添加的数据会是两个独立的Map实例,本地列表最终会得到你期望的结果:
[{sellerDate1: 10/31/2022, sellerQty1: 50}, {sellerDate1: 11/25/2022, sellerQty1: 54}]
内容的提问来源于stack exchange,提问作者Kvu
相关产品推荐
相关产品推荐

