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

Flutter中List.generate内的RadioListTile无法正常单选如何解决?

问题根源

RadioListTile的单选逻辑基于两个属性的匹配规则:

  • 同一组所有单选按钮的groupValue必须是同一个全局状态变量,用于标记当前组的选中值
  • 每个单选按钮的value为该选项对应的唯一标识,当value == groupValue时该按钮显示为选中状态

你现有代码的错误是给每个按钮单独设置了groupValue: sedi[index],相当于每个按钮属于独立分组,自然会出现全选、全不选的异常表现。

解决方案

方案1:用索引作为选中标识(推荐,性能最稳定)

首先在State类中新增全局状态存储当前选中的索引:

// 初始值设为null代表未选中任何项
int? _selectedSediIndex;

修改RadioListTile的属性配置:

return List.generate(
  sedi.length,
  (index) => RadioListTile<int>(
    value: index,
    // 整组统一使用同一个groupValue
    groupValue: _selectedSediIndex,
    onChanged: (value) {
      setState(() {
        // 更新全局选中索引即可
        _selectedSediIndex = value;
        // 如有需要可以同时给sedi项加选中标记:
        // for (var item in sedi) { item['selected'] = false; }
        // sedi[index]['selected'] = true;
      });
    },
    title: SedeTextColumn(
      sedi[index]['ADDRESS'].toString(),
      sedi[index]['CITY'].toString(),
      sedi[index]['PROVINCE'].toString(),
    ),
  ),
);

方案2:用Map对象作为选中标识

如果业务需要直接存储选中的Map对象,可以按如下调整:

// State类中新增全局状态存储选中的Map
Map<String, dynamic>? _selectedSedi;

修改RadioListTile配置:

return List.generate(
  sedi.length,
  (index) => RadioListTile<Map<String, dynamic>>(
    value: sedi[index],
    groupValue: _selectedSedi,
    onChanged: (value) {
      setState(() {
        _selectedSedi = value;
      });
    },
    title: SedeTextColumn(
      sedi[index]['ADDRESS'].toString(),
      sedi[index]['CITY'].toString(),
      sedi[index]['PROVINCE'].toString(),
    ),
  ),
);

注意:Dart中Map默认是引用相等判断,如果你的sedi列表是每次build重新生成的新实例,即使内容完全相同也会判定为不相等,导致选中状态失效,这种场景优先使用方案1。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 08:54:08