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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 07:25:39