问题背景:
页面点击事件后弹出dialog组件,内部使用了stateful的组件,发现dialog内容并没有刷新。
我重新定义了一个state状态赋给dialog组件,部分代码如下图
void ShowDialog(BuildContext context, Map r) {
showDialog<void>(
context: context,
//必须点击button
barrierDismissible: false,
builder: (BuildContext context) {
return StatefulBuilder(
builder: (context,state){
return Dialog(
child: Container(
padding: const EdgeInsets.all(20),
height: ScreenUtil().setHeight(750),
child: Column(
children: <Widget>[
TextField(
onChanged: (p) {
state(() {
phone = p;
});
},
发现可以刷新了,但是在dialog非正常退出后会报内存泄漏
”setState() called after dispose()“ 原因是没有dispose。
可用解决方案
因为dialog不受setState的影响,所以我们可以把Dialog的content拿出来,单独用一个Stateful Widget包裹起来,用独立的setState绕过Dialog实现控制内部动态组件的刷新。
void ShowDialog(BuildContext context, Map r) {
showDialog<void>(
context: context,
//必须点击button
barrierDismissible: false,
builder: (BuildContext context) {
return StatefulBuilder(
builder: (context,setState){
return Dialog(
child: MyDialog(arguments:r),
);
},
);
});
}
//新的Stateful Widget 存放 Dialog Content
class MyDialog extends StatefulWidget{
Map arguments;
MyDialog({Key key,this.arguments}):super(key :key);
@override
State<StatefulWidget> createState() => _MyDialogState(r:this.arguments);
}
class _MyDialogState extends State<MyDialog>{
_MyDialogState({this.r});
Map r;
//绑定
@override
void initState(){
super.initState();
}
@override
Widget build(BuildContext context) {
// TODO: implement build
return Container(
//...
);