Flutter中在SharedPreferences的列表添加字符串项问题
解决浏览历史仅显示最近一个商品的问题
问题根源
每次进入商品详情页时,你初始化了一个空的visitedProduct列表,直接添加当前商品ID后就覆盖存储,导致之前的历史记录被清空,最终只保留最新的一个ID。
修改方案
修改setViewedProduct方法,先读取已有的历史记录,再更新列表(包含去重、排序逻辑):
class _ProductInfoScreenState extends State<ProductInfoScreen> { Future setViewedProduct() async { SharedPreferences prefs = await SharedPreferences.getInstance(); // 读取本地存储的历史列表,为空则初始化空列表 List<String> visitedProducts = prefs.getStringList('viewedProductHistory') ?? []; // 去重:如果当前商品已在历史中,先移除旧记录 visitedProducts.remove(widget.productId); // 将当前商品插入列表头部,保证最近浏览的排在最前面 visitedProducts.insert(0, widget.productId); // 可选:限制历史记录数量,比如最多保存10条 if (visitedProducts.length > 10) { visitedProducts.removeRange(10, visitedProducts.length); } // 保存更新后的历史列表 await prefs.setStringList('viewedProductHistory', visitedProducts); } @override void initState() { getImage(); setViewedProduct(); super.initState(); } }
关键修改点
- 读取已有历史:不再使用页面内的空列表,而是从
SharedPreferences获取最新的历史数据,避免覆盖旧记录 - 去重优化:移除已存在的当前商品ID,防止重复展示
- 排序逻辑:将当前商品插入列表头部,保证浏览顺序是从新到旧
- 长度限制:可选添加列表长度限制,避免历史记录过多占用存储
读取历史的代码优化(可选)
可以给读取方法添加空值处理,避免后续UI报错:
Future<List<String>?> getVisitedProductsFuture() async { SharedPreferences prefs = await SharedPreferences.getInstance(); return prefs.getStringList('viewedProductHistory'); }
内容的提问来源于stack exchange,提问作者Davis
相关产品推荐
相关产品推荐

