我试图拥有一组单选按钮,这样我就可以一次从该组中选择一个。
我分组为ListView的单选按钮列表
ListView.builder(
shrinkWrap: true,
controller: _controller,
itemCount: _rampValues.length,
itemBuilder: (context, int index) {
var tt = _rampValues[index];
return ListTile(
title: Text(tt.name!, style: tBody5),
leading: Radio(
value: tt.selected!,
groupValue: _rampResult,
onChanged: (value) {
setState(() {
_rampResult = value.toString();
});
}),
);
})
该模型类似
List<ValueModel> _rampValues = [];
var _rampResult;
...
class ValueModel {
final int? id;
final int? subId;
final String? name;
final String? subName;
bool? selected;
bool? subSelected;
ValueModel(
{this.id,
this.subId,
this.name,
this.subName,
this.selected,
this.subSelected});
}
但是当我加载UI以查看它没有选择也没有响应时
我该怎么解决这个问题?
您的Radio
小部件的类型应该是ValueModel
以及Radiovalue
属性,如下所示:
ListView.builder(
shrinkWrap: true,
controller: _controller,
itemCount: _rampValues.length,
itemBuilder: (context, int index) {
var tt = _rampValues[index];
return ListTile(
title: Text(tt.name!),
leading: Radio<ValueModel>(
value: tt,
groupValue: _rampResult,
onChanged: (ValueModel? value) {
setState(() {
_rampResult = value;
});
}),
);
}),
当您调用setState
时
setState(() {
_rampResult = value.toString();
});
更改状态后,build
再次被触发,但单选按钮仍设置为仅检查selected
字段:
value: tt.selected!,
但这个领域并没有改变。所以你的单选按钮不会改变。您需要一个逻辑来更改setState
中的selected
字段,或者您的初始值应该与_rampResult
进行比较,以确定它是否被选中,而不是使用字段。