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
相关产品推荐
相关产品推荐

