Flutter如何单独选中指定RadioListTile而非同索引项全部被选中
问题根源
你当前所有ExpansionTile下的RadioListTile共用了同一个全局的dummy变量作为groupValue,单选按钮的选中逻辑是value == groupValue时就会显示选中状态,所以只要任意一个组里选中了值为i的选项,所有组里值为i的单选按钮都会满足选中条件,就出现了同步选中的问题。
解决方案
我们需要给每个ExpansionTile单独维护一个选中值,存储每个扩展项对应的选中子项索引:
- 将原来的单个int类型的
dummy变量,替换为和addonItem长度一致的列表,每个位置存储对应ExpansionTile下选中的子项索引,初始为null代表未选中。 - 每个
RadioListTile的groupValue绑定对应ExpansionTile位置的选中值。 - 选中时只修改当前
ExpansionTile对应的选中值即可。
修正后完整代码
class Addon extends StatefulWidget { @override _AddonState createState() => _AddonState(); } class _AddonState extends State<Addon> { List addonItem = ["Cool Drinks", "Extra Sauce"]; // 每个元素对应对应位置ExpansionTile的选中子项索引 List<int?> selectedAddonValues = []; @override void initState() { super.initState(); // 初始化所有扩展项的选中值为null(未选中) selectedAddonValues = List.filled(addonItem.length, null); } @override Widget build(BuildContext context) { return Scaffold( body: Container( child: ListView.builder( dragStartBehavior: DragStartBehavior.down, physics: ScrollPhysics(), shrinkWrap: true, itemCount: addonItem.length, itemBuilder: (context, index) { return ExpansionTile( initiallyExpanded: false, title: Text( addonItem[index], ), children: [ for (int i = 0; i < 3; i++) RadioListTile( value: i, title: Text("item $i"), // 绑定当前ExpansionTile对应的选中值 groupValue: selectedAddonValues[index], activeColor: Theme.of(context).primaryColor, onChanged: (val) { print(val); setState(() { // 只修改当前ExpansionTile的选中值 selectedAddonValues[index] = val; }); // 要获取所有选中的索引直接遍历selectedAddonValues即可 }, ) ], ); }), ), ); } }
内容的提问来源于stack exchange,提问作者Mohamed Jalal Jalal
相关产品推荐
相关产品推荐

