颤振 setState 不更新 showCupertinoDialog

问题描述

setState 在 showCupertinoDialog 中不起作用。当我获得异步数据时,我想更新对话框内的进度条。 _progress 值已更新且 setstate 已成功调用,但对话框未更新。我正在使用 statefulBuilder。

 showCupertinoDialog(
      context: context,builder: (BuildContext context) => CupertinoAlertDialog(
        title: Text("Preparing..."),content: StatefulBuilder(builder: (context,StateSetter setState) {
          print('ssetstatte');
          return Uploadindicator(_progress);
        }),actions: [
          CupertinoDialogAction(
            onpressed: () {
              Navigator.of(context).pop();
            },isDefaultAction: true,child: Text("Cancel"),),],).whenComplete(() {});



_uploadTask.snapshotEvents.listen((event) {
     
      _progress =
          event.bytesTransferred.todouble() / event.totalBytes.todouble();
/*THIS IS NOT UPDATING DIALOG*/
      setState(() {
        _progress = double.parse((_progress * 100).toStringAsFixed(2));
       
      });
});

解决方法

使用 StatefulBuilder 在 Dialog 中使用 setState 并仅在其中更新 Widgets。

 showDialog(
  context: context,builder: (context) {
    String contentText = "Content of Dialog";
    return StatefulBuilder(
      builder: (context,setState) {
        return AlertDialog(
          title: Text("Title of Dialog"),content: Text(contentText),actions: <Widget>[
            FlatButton(
              onPressed: () => Navigator.pop(context),child: Text("Cancel"),),FlatButton(
              onPressed: () {
                setState(() {
                  contentText = "Changed Content of Dialog";
                });
              },child: Text("Change"),],);
      },);
  },);
,

当你更新你的状态时,那个时候你必须使用 stfullWidget。先确认一下,是不是stfullWidget?如果没有,那么您应该使用 stfullWidget 插入 stlessWidget。

,

当您的异步数据正在更新时显示无状态小部件中的数据有状态小部件没有更新整个小部件,使用无状态小部件显示它立即更新状态的数据,有状态小部件设置该数据并无状态呈现该数据