为何FutureProvider获取的Product对象中相同维度值仅打印一次?
问题原因
你打印时用了Dart的集合字面量{},这种写法默认创建的是Set(集合)类型,而Set的核心特性是不允许存在重复元素。当P2的dim_x和dim_y都是80.0时,Set会自动去重,所以只保留了一个80.0,导致输出变成{80.0}而不是预期的两个值。
解决方案
方案1:改用列表[]存储值
把打印语句里的{}换成[],列表允许重复元素,能完整保留两个维度值:
print('\n${productList.map((e) => [e.dim_x, e.dim_y])}\n');
输出会变成:([200.0, 100.0], [80.0, 80.0])
方案2:用Map明确键值对(更易读)
如果想清晰看到每个值对应的字段名,改用Map:
print('\n${productList.map((e) => {'dim_x': e.dim_x, 'dim_y': e.dim_y})}\n');
输出会变成:({dim_x: 200.0, dim_y: 100.0}, {dim_x: 80.0, dim_y: 80.0})
额外优化点
你的ScheduledDelivery组件在initState里调用context.read<List<Product>>()存在风险:initState执行时,Widget还未完全关联到Provider的上下文,可能获取到的是初始空列表,且后续Provider数据更新时,productList不会自动刷新。建议改成在build方法里用context.watch:
@override Widget build(BuildContext context) { final productList = context.watch<List<Product>>(); print('\n${productList.map((e) => [e.dim_x, e.dim_y])}\n'); // ...其他代码 }
这样当Firestore的数据更新时,组件会自动重建并获取最新的产品列表。
内容的提问来源于stack exchange,提问作者pbs
相关产品推荐
相关产品推荐

