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

Flutter ListView.builder中如何实现Radio单选并获取选中值

Flutter Radio单选列表问题修复方案

问题1:单选按钮无法互斥的核心原因与修复

  • 类型不匹配:你代码中Radio的value是optionValueID(大概率为int类型),但在onChanged中手动转成String赋值给selectedRadio,value和groupValue类型不一致时,Radio无法正确判断选中状态,就会出现全选/全不选的异常。
  • 多组共用全局groupValue:如果你的modelOptions对应多个独立的单选组(比如不同规格分类:颜色、尺寸),所有组共用同一个selectedRadio作为groupValue,会导致页面所有Radio被识别为同一组,互斥逻辑混乱。

修复方式:

  1. 统一变量类型:selectedRadio的类型和optionValueID保持完全一致,不要做多余的类型转换。
  2. 多组场景用Map存储各组分选中值:
// 单组单选场景(只有一个选项组)
int? selectedRadio; // 和optionValueID类型一致
// 多组单选场景(多个独立选项组)
Map<int, int?> selectedGroupValues = {}; // key为选项组索引i,value为选中的ID

问题2:正确获取选中值的方法

Radio的onChanged回调会直接返回当前选中的value,不需要手动从数组里再次取值,要获取对应显示文本可以通过选中ID匹配数组得到。

修复后的核心代码:

Radio(
  // 单组场景用这个
  groupValue: selectedRadio,
  // 多组场景替换为下面的代码
  // groupValue: selectedGroupValues[i] ?? -1,
  value: modelOptions[i].modelOptionValues[j].optionValueID,
  activeColor: Colors.orangeAccent,
  onChanged:(value) {
    setState(() {
      // 单组场景赋值
      selectedRadio = value as int?;
      // 多组场景赋值
      // selectedGroupValues[i] = value as int?;
      print("选中的选项ID:$selectedRadio");
      // 获取选中的显示文本
      String selectedName = modelOptions[i].modelOptionValues
          .firstWhere((e) => e.optionValueID == selectedRadio)
          .valueName;
      showToastMessage('$selectedName 已选中');
    });
  }
),

额外注意

你贴出的原代码存在多余的闭合括号语法错误,修改时要注意清理冗余符号,避免编译异常。

内容的提问来源于stack exchange,提问作者Smile

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 11:15:03