为何SwitchListTile拆分为独立Widget后点击无响应?求原理解释
问题原因与修复原理
初始代码失效的核心原因
Dart里的基本类型(比如bool)是值传递,你调用_buildSwitchListTile时传入的check,其实是把它的数值复制了一份传给currentValue参数。
在onChanged里写的setState(() { currentValue = newValue; });,本质上只是修改了这个局部的副本变量,完全碰不到State里真正存储状态的check变量。而且这里的setState虽然会触发组件重建,但因为check的值根本没变化,重建后传给SwitchListTile的currentValue还是原来的false,所以开关看起来完全没反应。
修复代码的工作原理
改成传入Function(bool) updateValue回调函数,相当于给_buildSwitchListTile传递了一个能直接修改原状态的操作指令:
- 当开关被点击时,
SwitchListTile会调用你传入的updateValue函数 - 这个函数内部直接修改State里的
check变量,然后调用setState通知Flutter框架状态发生变化 - Flutter触发
SwitchScreen的build方法重新执行,此时传给_buildSwitchListTile的currentValue就是更新后的check值,开关状态也就同步更新了
简单说,初始代码是在修改“复印件”,修复后的代码是通过回调直接修改“原件”,再让UI跟着原件刷新。
内容的提问来源于stack exchange,提问作者DungxLas
相关产品推荐
相关产品推荐

