Flutter教程中Cart类用Map而非列表存储购物项的疑问
Map<String, CartItem>而不是List<Map<String,CartItem>>? 你的疑问很典型,其实教程里用Map<String, CartItem>是完全贴合购物车业务逻辑的合理选择,原因如下:
高效去重与查找:购物车的核心需求之一是「同一个商品只保留一条记录,数量累加」,用商品ID(
productId)作为Map的key,能直接通过containsKey判断商品是否已在购物车,这个操作的时间复杂度是O(1),远快于遍历List查找的O(n)。便捷更新商品数量:看代码里的
addItem方法,当商品已存在时,直接调用Map.update就能快速修改已有CartItem的数量;如果用List的话,你得先遍历整个列表找到对应商品,再手动修改数量,代码会繁琐很多。数据结构更简洁合理:
CartItem类本身已经包含了quantity字段,足以表达「某个商品买了多少件」的信息。如果用List<Map<String,CartItem>>,相当于把每个商品单独存成List里的一个Map元素,既会导致同一个商品可能被重复添加(没法自动去重),还会造成数据冗余,完全没必要。
举个简单例子:假设你买了2件苹果,用Map的话就是{'appleId': CartItem(quantity:2, ...)},清晰明了;用你说的List结构,可能变成[{'appleId': CartItem(quantity:1)}, {'appleId': CartItem(quantity:1)}],这显然不符合购物车的实际需求——我们需要的是合并数量,而不是分开记录。
再看代码里的itemCount getter,直接返回_items.length就能得到购物车里的商品种类数,如果用List的话,这个值会变成商品的总件数,和业务逻辑不符(除非你额外统计,但又多了一步操作)。
内容的提问来源于stack exchange,提问作者Irfan Ganatra

