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

Flutter问题:ListTile内的Radio按钮无法选中

解决Flutter ListTile内Radio按钮无法选中的问题

问题核心出在状态变量的作用域错误:你在OrderItem方法里定义了局部变量selectedValue = 0,每次setState触发组件重建时,OrderItem会被重新创建,这个局部变量会被重置为0,导致Radio无法维持选中状态。同时你State类中定义的selectedValue完全没被用到,属于冗余代码。

修复步骤:

  1. 移除OrderItem内的局部selectedValue变量,直接使用State类成员的selectedValue
  2. 确保onChanged回调更新的是State类的成员变量,让状态能被正确保留和同步

修正后的完整代码:

class _TempState extends State<Temp> {
  // 将选中状态放在State类成员中,确保状态全局可维护
  int selectedValue = 0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Container(
          child: Column(
            children: [
              Row(
                children: [
                  Expanded(child: Text("Radio button with ListView")),
                ],
              ),
              Expanded(
                child: ListView.builder(
                  itemCount: 1,
                  itemBuilder: (BuildContext context, int index) {
                    return OrderItem();
                  },
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }

  Widget OrderItem() {
    // 移除局部状态变量,直接使用State类的成员变量
    return ListTile(
      title: Container(
        child: Column(
          children: [
            Row(
              children: [
                Expanded(child: Text("Product Type :")),
                Radio<int>(
                  value: 1,
                  groupValue: selectedValue,
                  onChanged: (value) {
                    setState(() {
                      selectedValue = value ?? 1;
                    });
                  },
                ),
                Text('NRML'),
                Radio<int>(
                  value: 2,
                  groupValue: selectedValue,
                  onChanged: (value) {
                    setState(() {
                      selectedValue = value ?? 1;
                    });
                  },
                ),
                Text('MARKET'),
              ],
            ),
          ],
        ),
      ),
    );
  }
}

额外优化建议:

如果后续OrderItem需要复用,建议将选中状态和回调作为参数传入,实现组件解耦:

Widget OrderItem({required int selectedValue, required Function(int?) onChanged}) {
  return ListTile(
    title: Container(
      child: Column(
        children: [
          Row(
            children: [
              Expanded(child: Text("Product Type :")),
              Radio<int>(
                value: 1,
                groupValue: selectedValue,
                onChanged: onChanged,
              ),
              Text('NRML'),
              Radio<int>(
                value: 2,
                groupValue: selectedValue,
                onChanged: onChanged,
              ),
              Text('MARKET'),
            ],
          ),
        ],
      ),
    ),
  );
}

在ListView.builder中调用时:

return OrderItem(
  selectedValue: selectedValue,
  onChanged: (value) {
    setState(() {
      selectedValue = value ?? 1;
    });
  },
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 18:35:20