Flutter店铺应用禁用尺码调整按钮时传空引发空检查操作符报错
问题原因
报错Null check operator used on a null value的根源是EditItemSize组件中对三个回调参数直接使用了非空断言!强制解包,但你在创建EditItemSize实例时,当尺码排在列表第一位时会给上移回调传null,排在最后一位时会给下移回调传null,运行到对应位置强制解包空值就触发了报错。
另外你还存在参数传反的问题:EditItemSize构造函数的参数顺序是key, size, onRemove, onMoveDown, onMoveUp,你传参时把上移逻辑传给了第四个参数onMoveDown,下移逻辑传给了第五个参数onMoveUp,就算空值问题解决,按钮点击的逻辑也会是反的。
修复方案
- 修正
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!() : (){}, )
- 修正
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
相关产品推荐
相关产品推荐

