Flutter中RadioListTile绑定数据后无法修改选中状态问题
解决RadioListTile选中状态无法修改的问题
嘿,我瞅了你的代码,知道为啥RadioListTile选中状态改不了啦!核心问题就是你把控制选中状态的_license变量放在build方法里了,这可不行——每次你点单选按钮触发setState,build方法会重新执行,_license又会被重新赋值成从ProList里拿的初始值,等于白改了!
另外,每次build都去遍历ProList找数据也有点浪费性能,咱们一起把代码调整一下:
关键修改点
- 把
_license提升为State类的成员变量,让它的状态能被State对象持久持有,不会每次build都重置 - 把初始化
_license的逻辑移到initState(或didChangeDependencies)里,只执行一次(或在依赖变化时更新) - 给RadioListTile指定明确的泛型类型,代码更规范还能避免警告
修改后的完整代码
class YourWidgetState extends State<YourWidget> { // 把_license改成State类的成员变量 int _license; @override void initState() { super.initState(); // 初始化_license的值,这里假设idC在initState时已经可用 var filteredItem = ProList.firstWhere( (element) => element.idPush == idC, orElse: () => null, ); if (filteredItem != null) { _license = int.parse(filteredItem.license); } else { // 处理找不到对应item的情况,给个默认值 _license = 1; } } // 如果idC是依赖上下文/InheritedWidget的,就用didChangeDependencies代替initState // @override // void didChangeDependencies() { // super.didChangeDependencies(); // var filteredItem = ProList.firstWhere( // (element) => element.idPush == idC, // orElse: () => null, // ); // if (filteredItem != null) { // _license = int.parse(filteredItem.license); // } else { // _license = 1; // } // } // 给RadioListTile指定泛型为int,类型更明确 RadioListTile<int> buildRadioListLicense(int val, String txt) { return RadioListTile<int>( controlAffinity: ListTileControlAffinity.leading, activeColor: myRed, value: val, groupValue: _license, onChanged: (value) { // 加个非空判断,避免null报错 if (value != null) { setState(() { _license = value; }); } }, title: Text(txt), ); } @override Widget build(BuildContext context) { return Scaffold( body: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( child: buildRadioListLicense(1, getTranslated(context, 'received')), ), Expanded( child: buildRadioListLicense(2, getTranslated(context, 'inProgress')), ), Expanded( child: buildRadioListLicense(3, getTranslated(context, 'done')), ) ], ), ); } }
额外说明
- 如果你的
idC是需要从上下文获取的(比如来自InheritedWidget或Provider),那就把初始化逻辑放到didChangeDependencies里,因为initState时上下文还没完全准备好 - 加的非空判断是为了防止
onChanged回调传null导致的运行时错误,更稳妥
内容的提问来源于stack exchange,提问作者eslam
相关产品推荐
相关产品推荐

