【问题标题】:flutter setState not updating showCupertinoDialog颤振 setState 不更新 showCupertinoDialog
【发布时间】:2021-01-25 10:09:44
【问题描述】:

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));
       
      });
});

【问题讨论】:

  • 问题是调用setState 没有使用StatefulBuildersetState 并且可能调用StatefulWidget 的。您最好让一个对象实现ChangeNotifier 并在对话框中监听该对象的更改

标签: flutter setstate showdialog


【解决方案1】:

使用 StatefulBuilder 在 Dialog 内部使用 setState 并仅在其中更新 Widget。

 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"),
            ),
          ],
        );
      },
    );
  },
);

【讨论】:

  • 这不起作用。我是从外部而不是从 showDialog 内部更新。在里面 showDialog 我只想显示更新的值
【解决方案2】:

当你更新你的状态时,你必须使用 stfullWidget。首先确保,它是 stfullWidget 还是不是?如果没有,那么你应该使用 stfullWidget insted of stlessWidget。

【讨论】:

  • 两者都是有状态的小部件
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 2021-10-20
    • 1970-01-01
    • 2020-07-13
    • 2021-04-04
    • 2021-07-21
    • 1970-01-01
    相关资源
    最近更新 更多