Flutter问题:ListTile内的Radio按钮无法选中
解决Flutter ListTile内Radio按钮无法选中的问题
问题核心出在状态变量的作用域错误:你在OrderItem方法里定义了局部变量selectedValue = 0,每次setState触发组件重建时,OrderItem会被重新创建,这个局部变量会被重置为0,导致Radio无法维持选中状态。同时你State类中定义的selectedValue完全没被用到,属于冗余代码。
修复步骤:
- 移除
OrderItem内的局部selectedValue变量,直接使用State类成员的selectedValue - 确保
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
相关产品推荐
相关产品推荐

