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

Flutter中RadioListTile点击后状态不更新问题求助

问题:RadioListTile点击后单选状态不更新

代码中默认选中第一项正常,但点击其他选项时,控制台打印显示selectedBell值已正确变更,但UI上单选按钮状态不切换。

问题原因

你提前将RadioListTile实例添加到widgets列表中,每个RadioListTile的groupValue和selected参数在创建时就固定为当时的selectedBell快照值。后续selectedBell变化时,这些已创建的Widget不会自动更新参数,导致UI无法响应状态变更。

修复代码

class SelectBell extends StatefulWidget {
  SelectBell({
    super.key,
  });

  @override
  State<SelectBell> createState() => _SelectBellState();
}

class _SelectBellState extends State<SelectBell> {
  List<Bell> bells = []; // 存储Bell数据而非预构建的Widget
  Bell? selectedBell;

  @override
  void initState() {
    super.initState();
    loadBells();
  }

  void loadBells() async {
    DB().getBells().then((fetchedBells) {
      setState(() {
        bells = fetchedBells;
        // 默认选中第一项(如果列表非空)
        if (selectedBell == null && bells.isNotEmpty) {
          selectedBell = bells.first;
        }
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        padding: EdgeInsets.all(20),
        width: 250,
        child: Column(
          // 在build阶段动态生成RadioListTile,确保每次状态变化都使用最新值
          children: bells.map((bell) {
            return RadioListTile(
              title: Text(bell.name),
              value: bell,
              groupValue: selectedBell,
              onChanged: (value) {
                setState(() {
                  selectedBell = value!;
                });
              },
              selected: selectedBell == bell,
            );
          }).toList(),
        ),
      ),
    );
  }
}

核心修改点

  • 将存储Widget的widgets列表改为存储Bell数据的bells列表
  • loadBells方法仅负责获取并更新数据,不提前构建Widget
  • 在build方法中通过map动态生成RadioListTile,每次setState后都会基于最新的selectedBell重新渲染,确保UI与状态同步

内容的提问来源于stack exchange,提问作者Андрей Веселов

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 00:11:00