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

GetX商品列表初始化引发索引错误:排查与修复方案

问题描述

我用GetX构建商品列表的响应式模型,在StatelessWidget的build方法里,列表初始化时为空,触发了索引错误(虽然列表实际有数据,但初始显示为空,之后会自动恢复正常)。我试过用try-catch处理,但catch块根本没触发。

相关代码

Widget代码

return GetX<CartController>(
  init: CartController(),
  builder: (controller) {
    try {
      return Text(
        "${StringConvert.toMoney(controller.totalByProduct[productId])}",
        style: kSmallTextBold,
      );
    } catch (e) {
      return const Text("Error...");
    }
  },
);

控制器代码

var totalByProduct = [].obs;
fetchTotal() {
  List products = storage.read(StorageKeys.cartProducts);
  double currentValue = 0.0;
  List currentTotals = [];
  for (var item in products) {
    currentTotals.add(item['total'] * item['amount']);
    currentValue += item['total'] * item['amount'];
  }
  total.value = currentValue;
  totalByProduct.value = currentTotals;
}
解决方案
  • 初始化时填充默认值,避免空列表访问
    在控制器的onInit生命周期里,先读取本地商品列表,初始化对应长度的默认值(比如0.0),再调用fetchTotal:

    var totalByProduct = <double>[].obs;
    
    @override
    void onInit() {
      super.onInit();
      List products = storage.read(StorageKeys.cartProducts) ?? [];
      // 初始化和商品数量一致的默认值列表
      totalByProduct.value = List.filled(products.length, 0.0);
      fetchTotal();
    }
    
  • 在Widget中添加索引合法性校验
    直接在builder里判断索引是否在有效范围内,替代try-catch(框架层会捕获越界异常,你的try-catch无法触发):

    return GetX<CartController>(
      init: CartController(),
      builder: (controller) {
        // 校验列表非空且索引合法
        if (controller.totalByProduct.isEmpty || 
            productId < 0 || 
            productId >= controller.totalByProduct.length) {
          return Text("0.00", style: kSmallTextBold);
        }
        return Text(
          "${StringConvert.toMoney(controller.totalByProduct[productId])}",
          style: kSmallTextBold,
        );
      },
    );
    
  • 优化fetchTotal方法的空值处理
    读取本地存储时加空值判断,同时校验商品字段的有效性,避免空指针:

    fetchTotal() {
      List products = storage.read(StorageKeys.cartProducts) ?? [];
      double currentValue = 0.0;
      List<double> currentTotals = [];
      for (var item in products) {
        double itemTotal = item['total'] ?? 0.0;
        int itemAmount = item['amount'] ?? 1;
        currentTotals.add(itemTotal * itemAmount);
        currentValue += itemTotal * itemAmount;
      }
      total.value = currentValue;
      totalByProduct.value = currentTotals;
    }
    

内容的提问来源于stack exchange,提问作者tekboxs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 21:25:21