Flutter GetX多层导航返回后已选scheme数据丢失问题
问题根因
跳转返回后优惠方案展示消失是三个逻辑错误共同导致的:
- 判断是否展示优惠卡片的条件完全依赖全局的
schemeMsgController.text临时状态,这个状态属于页面级临时变量,页面跳转返回触发重建时会被重置,直接走到不展示优惠卡片的else分支。 - 你已经在
OrderItemModel里定义了isScheme字段标记商品是否关联优惠方案,但列表构建时完全没用到这个和订单项绑定的持久状态,判断逻辑和单个商品数据完全脱钩。 - 优惠卡片内的展示值全部取自全局控制器的临时属性(比如
currentProductTitle、各个scheme专属的TextEditingController),没有绑定到当前遍历到的订单项自身数据,就算状态没重置,多商品场景下也会出现展示内容串位的问题。
修复方案
1. 调整列表构建逻辑
把判断条件从全局控制器状态改成当前订单项的isScheme属性,所有展示值直接从当前订单项取值,不要依赖全局临时控制器:
Obx(() { return ListView.builder( shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), itemCount: salesController.currentOrderItems.length, itemBuilder: (context, index) { final currentItem = salesController.currentOrderItems[index]; // 直接用订单项自身的isScheme字段判断,不依赖全局临时状态 if (currentItem.isScheme) { // 当场计算当前项的优惠数量,不用给全局控制器赋值 int schemeQuantity = (double.parse(currentItem.qty) / 5).toInt(); return Column( children: [ CreateOrderTiles(orders: currentItem), // 优惠UI模块 Card( color: Colors.white.withOpacity(0.1), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Text( currentItem.title, // 直接取当前项的标题,不依赖全局currentProductTitle textAlign: TextAlign.start, style: TextStyle( fontWeight: FontWeight.bold, ), ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text("$schemeQuantity pcs"), Text("Rs: ${currentItem.netRate}"), // 直接取当前项的净价 Text("0.00"), ], ), ], ), ), ), ], ); } else { return CreateOrderTiles(orders: currentItem); } }); })
2. 校验加项传参
选中优惠方案调用addItemToOrder时,必须把isScheme参数传true,确保订单项的标记位正确写入持久存储的列表中:
// 选中优惠方案后加项调用示例 salesController.addItemToOrder(true); // 普通无优惠商品加项传false salesController.addItemToOrder(false);
3. 可选优化
如果优惠方案有单独的活动标题、专属折扣价等特殊属性,直接在OrderItemModel里新增对应字段存储,选方案的时候把值写入订单项,不要存在全局控制器里,从根源上避免页面重建、多商品场景下的状态丢失、数据串位问题。
内容的提问来源于stack exchange,提问作者Anil Shah
相关产品推荐
相关产品推荐

