Flutter列表单值维护:点击单选按钮仅保留当前选中值
问题修复方案
你的代码问题出在_addItemToList方法的逻辑上:当选中新的单选按钮时,新的水果值不在列表中,所以不会执行移除操作,直接添加新值,导致列表同时保留旧值和新值。要实现列表始终仅保留当前选中项,可以按以下方式修复:
修复思路
每次添加新项前,先清空整个列表,再将当前选中的项添加进去,确保列表永远只有一个元素。
修复后的代码
class cartMock extends StatefulWidget { const cartMock({Key? key}) : super(key: key); @override State<cartMock> createState() => _cartMockState(); } class _cartMockState extends State<cartMock> { String? _selectedFruit; final List<String> _fruits = []; void _addItemToList(String item) { // 先清空列表,再添加当前选中项 _fruits.clear(); _fruits.add(item); } @override Widget build(BuildContext context) { return Scaffold( body: Column( children: [ Expanded( child: ListView.builder( itemCount: _fruits.length, itemBuilder: (context, index) { return ListTile( title: Text(_fruits[index]), ); }, ), ), RadioListTile( value: "apple", groupValue: _selectedFruit, onChanged: (value) { setState(() { if (value != _selectedFruit) { _selectedFruit = value as String?; _addItemToList("apple"); } }); }, title: const Text("Apple"), ), RadioListTile( value: "orange", groupValue: _selectedFruit, onChanged: (value) { setState(() { if (value != _selectedFruit) { _selectedFruit = value as String?; _addItemToList("orange"); } }); }, title: const Text("Orange"), ), ], ), ); } }
额外优化建议
其实你已经维护了_selectedFruit变量来记录选中状态,完全可以直接用这个变量渲染列表,不需要额外维护_fruits列表,这样能简化代码:
// 移除_fruits列表,直接用_selectedFruit渲染 Expanded( child: ListView.builder( itemCount: _selectedFruit == null ? 0 : 1, itemBuilder: (context, index) { return ListTile( title: Text(_selectedFruit!), ); }, ), ),
这样既满足需求,又减少了不必要的状态维护。
内容的提问来源于stack exchange,提问作者Jabu
相关产品推荐
相关产品推荐

