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

Flutter店铺应用禁用尺码调整按钮时传空引发空检查操作符报错

问题原因

报错Null check operator used on a null value的根源是EditItemSize组件中对三个回调参数直接使用了非空断言!强制解包,但你在创建EditItemSize实例时,当尺码排在列表第一位时会给上移回调传null,排在最后一位时会给下移回调传null,运行到对应位置强制解包空值就触发了报错。
另外你还存在参数传反的问题:EditItemSize构造函数的参数顺序是key, size, onRemove, onMoveDown, onMoveUp,你传参时把上移逻辑传给了第四个参数onMoveDown,下移逻辑传给了第五个参数onMoveUp,就算空值问题解决,按钮点击的逻辑也会是反的。

修复方案
  1. 修正EditItemSize组件的回调逻辑,不要强制解包可空的回调参数,空值时直接传null即可,一般自定义按钮组件接收null回调时会自动处于禁用状态,刚好符合你要的首尾按钮不可点的需求:
// EditItemSize 里的三个按钮修改为如下写法
CustomIconButton(
  Icons.remove,
  Colors.red,
  onRemove,
),
CustomIconButton(
  Icons.arrow_drop_up, 
  Colors.black, 
  onMoveUp,
),
CustomIconButton(
  Icons.arrow_drop_down, 
  Colors.black, 
  onMoveDown,
)

如果你的CustomIconButton不支持null回调,就改成非空才执行的写法:

CustomIconButton(
  Icons.arrow_drop_up, 
  Colors.black, 
  onMoveUp != null ? () => onMoveUp!() : (){},
)
  1. 修正SizesForm里创建EditItemSize时的参数顺序,同时把ObjectKey改为绑定当前size,避免列表刷新时出现元素复用异常:
return EditItemSize(
  ObjectKey(size), //  key绑定当前size
  size,
  () {
    state.value!.remove(size);
    state.didChange(state.value);
  },
  // 第四个参数是onMoveDown,传下移逻辑
  size != state.value!.last
      ? () {
          final index = state.value!.indexOf(size);
          state.value!.remove(size);
          state.value!.insert(index + 1, size);
          state.didChange(state.value);
        }
      : null,
  // 第五个参数是onMoveUp,传上移逻辑
  size != state.value!.first
      ? () {
          final index = state.value!.indexOf(size);
          state.value!.remove(size);
          state.value!.insert(index - 1, size);
          state.didChange(state.value);
        }
      : null,
);

内容的提问来源于stack exchange,提问作者Nilton Schumacher F

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 02:54:02