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

Flutter ChoiceChip单选失效:选中新选项旧选项不取消如何解决?

问题原因

你当前每个ChipWidget都维护了独立的选中状态,组件之间没有状态同步,所以点击新的Chip不会更新其他Chip的选中状态,无法实现单选效果。单选的全局选中状态需要提升到父组件统一维护,所有子Chip的选中状态都由父组件的全局状态控制。

具体修改步骤

1. 重构ChipWidget组件

移除内部维护的选中状态,改为接收父组件传入的选中状态和选中回调:

class ChipWidget extends StatelessWidget {
  const ChipWidget({
    Key? key,
    required this.label,
    required this.listIndex,
    required this.isSelected,
    required this.onSelected,
  }) : super(key: key);

  final String label;
  final int listIndex;
  final bool isSelected;
  final ValueChanged<int> onSelected;

  @override
  Widget build(BuildContext context) {
    return ChoiceChip(
      label: Text(label),
      selected: isSelected,
      selectedColor: Colors.red,
      onSelected: (value) {
        if (value) {
          onSelected(listIndex);
        } else {
          // 支持取消选中时传-1,不需要取消选中可删除该分支
          onSelected(-1);
        }
      },
    );
  }
}

2. 修改HomeScreen组件

新增全局选中索引状态,将状态和回调传递给每个ChipWidget:

class HomeScreen extends StatefulWidget {
  const HomeScreen({Key? key}) : super(key: key);

  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  List<String> _chipItems = [];
  // 全局维护当前选中的Chip索引,null表示未选中任何
  int? _selectedChipIndex;

  @override
  void initState() {
    super.initState();
    _chipItems = ["Terleme", "Aşırı Düşünme", "Baş Ağrısı", "Mide Bulantısı"];
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        height: MediaQuery.of(context).size.height,
        child: Padding(
          padding: const EdgeInsets.all(8.0),
          child: Center(
            child: Wrap(
              spacing: 8, // 可选:增加Chip之间的间距
              children: _chipItems
                  .asMap()
                  .map((key, value) => MapEntry(
                      key,
                      ChipWidget(
                        label: value,
                        listIndex: key,
                        isSelected: _selectedChipIndex == key,
                        onSelected: (index) {
                          setState(() {
                            _selectedChipIndex = index == -1 ? null : index;
                          });
                        },
                      )))
                  .values
                  .toList(),
            ),
          ),
        ),
      ),
    );
  }
}

修改完成后所有Chip的选中状态都由父组件的_selectedChipIndex统一控制,点击任意Chip都会更新全局状态触发所有Chip重绘,即可实现同一时间仅选中一个的单选效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 20:36:04