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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:25:29