You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 13:33:23