复选框未在 showDialog 颤动中选中
Checkbox not check inside showDialog flutter
我已经将我的代码设置为当我点击列表图块时,它应该弹出一个对话框,在对话框中我有 3 个复选框,它们正在工作,因为值正在正确更新但复选标记没有出现起初除非我第一次点击,重新打开对话框,否则它会出现,如果有人可以帮助解决我的问题,提前谢谢你。
- 这是我的代码
void _showTemperatureUnit(BuildContext context){
showDialog(
context: context,
builder: (context){
return StatefulBuilder(
builder: (context,state){
return AlertDialog(
title: Text('Pick A Unit',style: TextStyle(fontFamily: 'bebas',
fontWeight: FontWeight.bold),),
content: Container(
height: MediaQuery.of(context).size.height / 5,
child: Column(
children: [
Row(
children: [
Expanded(child: Text('Celsius ',style: TextStyle(fontFamily: 'bebas',
fontWeight: FontWeight.bold),),flex: 9,),
Flexible(
child: Checkbox(
value: _isCelsius,
onChanged: (val){
setState(() {
_isCelsius = val!;
_isKelvin = false;
_isFer = false;
_selectedUnit = 'metric';
});
},
),
flex: 1,
)
],
),
SizedBox(height: 5,),
Row(
children: [
Expanded(child: Text("Fahrenheit",style: TextStyle(fontFamily: 'bebas',
fontWeight: FontWeight.bold),),flex: 9,),
Flexible(
child: Checkbox(
value: _isFer,
onChanged: (val){
setState(() {
_isFer = val!;
_isCelsius = false;
_isKelvin = false;
_selectedUnit = 'standard';
});
},
),
flex: 1,
)
],
),
SizedBox(height: 5,),
Row(
children: [
Expanded(child: Text('Kelvin',style: TextStyle(fontFamily: 'bebas',
fontWeight: FontWeight.bold),),flex: 9,),
Flexible(
child: Checkbox(
value: _isKelvin,
onChanged: (val){
setState(() {
_isKelvin = val!;
_isFer = false;
_isCelsius = false;
_selectedUnit = 'imperial';
});
},
),
flex: 1,
)
],
)
],
),
),
actions: [
RaisedButton(onPressed: () async {
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString('unit', _selectedUnit);
Navigator.push(context, MaterialPageRoute(builder: (context) => WeatherPage()));
},child: Text('Pick',style: TextStyle(color: Colors.white),),color: Colors.blue,),
RaisedButton(onPressed: (){
Navigator.pop(context);
},child: Text('Cancel',style: TextStyle(color: Colors.white),),color: Colors.blue,)
],
);
},
);
});
}
您正在使用调用 _showTemperatureUnit
函数的有状态小部件的 setState
。但是请检查您的 StatefulBuilder
构建器参数,您正在执行以下操作
builder: (context,state){
...
}
这意味着如果您需要重建对话框的状态,您需要使用 StatefulBuilder
的 state
函数而不是调用该函数的有状态小部件的 setState
因此您需要按如下方式更改代码:
onChanged: (val){
state(() {
_isFer = val!;
_isCelsius = false;
_isKelvin = false;
_selectedUnit = 'standard';
});
},
您可以将关键字 state
更改为您想要的任何关键字
替换
StatefulBuilder(
builder: (context, state) {
设置状态
StatefulBuilder(
builder: (context, setState) {
因为setState
是需要触发的函数调用
StatefulBuilder
创建一个既有状态又将其构建委托给回调的小部件。
我已经将我的代码设置为当我点击列表图块时,它应该弹出一个对话框,在对话框中我有 3 个复选框,它们正在工作,因为值正在正确更新但复选标记没有出现起初除非我第一次点击,重新打开对话框,否则它会出现,如果有人可以帮助解决我的问题,提前谢谢你。
- 这是我的代码
void _showTemperatureUnit(BuildContext context){
showDialog(
context: context,
builder: (context){
return StatefulBuilder(
builder: (context,state){
return AlertDialog(
title: Text('Pick A Unit',style: TextStyle(fontFamily: 'bebas',
fontWeight: FontWeight.bold),),
content: Container(
height: MediaQuery.of(context).size.height / 5,
child: Column(
children: [
Row(
children: [
Expanded(child: Text('Celsius ',style: TextStyle(fontFamily: 'bebas',
fontWeight: FontWeight.bold),),flex: 9,),
Flexible(
child: Checkbox(
value: _isCelsius,
onChanged: (val){
setState(() {
_isCelsius = val!;
_isKelvin = false;
_isFer = false;
_selectedUnit = 'metric';
});
},
),
flex: 1,
)
],
),
SizedBox(height: 5,),
Row(
children: [
Expanded(child: Text("Fahrenheit",style: TextStyle(fontFamily: 'bebas',
fontWeight: FontWeight.bold),),flex: 9,),
Flexible(
child: Checkbox(
value: _isFer,
onChanged: (val){
setState(() {
_isFer = val!;
_isCelsius = false;
_isKelvin = false;
_selectedUnit = 'standard';
});
},
),
flex: 1,
)
],
),
SizedBox(height: 5,),
Row(
children: [
Expanded(child: Text('Kelvin',style: TextStyle(fontFamily: 'bebas',
fontWeight: FontWeight.bold),),flex: 9,),
Flexible(
child: Checkbox(
value: _isKelvin,
onChanged: (val){
setState(() {
_isKelvin = val!;
_isFer = false;
_isCelsius = false;
_selectedUnit = 'imperial';
});
},
),
flex: 1,
)
],
)
],
),
),
actions: [
RaisedButton(onPressed: () async {
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString('unit', _selectedUnit);
Navigator.push(context, MaterialPageRoute(builder: (context) => WeatherPage()));
},child: Text('Pick',style: TextStyle(color: Colors.white),),color: Colors.blue,),
RaisedButton(onPressed: (){
Navigator.pop(context);
},child: Text('Cancel',style: TextStyle(color: Colors.white),),color: Colors.blue,)
],
);
},
);
});
}
您正在使用调用 _showTemperatureUnit
函数的有状态小部件的 setState
。但是请检查您的 StatefulBuilder
构建器参数,您正在执行以下操作
builder: (context,state){
...
}
这意味着如果您需要重建对话框的状态,您需要使用 StatefulBuilder
的 state
函数而不是调用该函数的有状态小部件的 setState
因此您需要按如下方式更改代码:
onChanged: (val){
state(() {
_isFer = val!;
_isCelsius = false;
_isKelvin = false;
_selectedUnit = 'standard';
});
},
您可以将关键字 state
更改为您想要的任何关键字
替换
StatefulBuilder(
builder: (context, state) {
设置状态
StatefulBuilder(
builder: (context, setState) {
因为setState
是需要触发的函数调用
StatefulBuilder
创建一个既有状态又将其构建委托给回调的小部件。