在Flutter中使用Dialog时,因为showDialog返回的context与当前页面的context不是同一个,所以通过setState是无法刷新Dialog里面的页面的。
这时我们就可以用StatefulBuilder实现,通过StatefulBuilder包裹后的Widget就变成有状态的Widget了,我们就可以通过StatefulBuilder返回的state进行刷新Dialog内的内容了。
解决方案:使用StatefulBuilder返回的state函数,调用state((){});刷新页面。
showDialog(
context: context,
barrierDismissible: true,
builder: (BuildContext context) {
return StatefulBuilder(
builder: (context,state){
return AlertDialog(
title: Text("Dialog标题"),
contentPadding:const EdgeInsets.fromLTRB(20, 20, 0, 0),
content: Container(
height: 300,
child:ListView.builder(
primary: true,
shrinkWrap: true,
scrollDirection: Axis.vertical,
physics: new ClampingScrollPhysics(),
itemCount: _items.length,
itemBuilder: (context, index) {
return Container(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(_items.elementAt(index).text),
YmCheckButton(value:_items.elementAt(index).value,
checked:_currentValue==_items.elementAt(index).value,
onChanged: (bool checked,dynamic value){
if(checked){
_currentValue = value;
}
state((){}); //刷新Dialog内的内容
},
text: "",
image: "assets/images/ic_radio.png",
checkedImage: "assets/images/ic_radio_checked.png",
),
],
),
);
},
),
),
actions:[
TextButton(
child: Text("取消"),
onPressed: () {
Navigator.of(context).pop();
},
),
TextButton(
child: Text("确认"),
onPressed: () {
Navigator.of(context).pop();
},
),
],
);
} ,
);
},
).then((val) {
print(val);
});
本站内容来源于作者发布和网络转载,如有版权相关问题请及时与我们取得联系,我们将立即删除。