0

我想在警报对话框中制作下载进度消息,但状态未在模态中更新,这是使用 dio 的下载功能

downloadBook() async {
    Directory tempDir = await getTemporaryDirectory();
    var response = await dio.download(widget.bookModel.acf.bookLink,
        tempDir.path + '/books/' + widget.bookModel.title.rendered + '.epub',
        options: Options(
          responseType: ResponseType.bytes,
        ), onReceiveProgress: (actualbytes, totalbytes) {
      var percenatge = actualbytes / totalbytes * 100;
      _percentageBar = percenatge / 100;
      setState(() {
        downloadMessage = 'Downloading... ${percenatge.floor()} %';
      });
    });
  }

这是警报对话功能

void _showDialog(BuildContext context) {
    showDialog(
      context: context,
      builder: (BuildContext context) {
        return AlertDialog(
          title: new Text("Alert!!"),
          content: new Text(downloadMessage),
          actions: <Widget>[
            new FlatButton(
              child: new Text("OK"),
              onPressed: () {
                Navigator.of(context).pop();
              },
            ),
          ],
        );
      },
    );
  }

我在文本按钮内拨打了这样的电话,但消息停留在 0% 且未更新;

onPressed: () {
        // _showDialog(context);
        downloadBook();
        showDialog(
          context: context,
          builder: (context) {
            String contentText = "Content of Dialog";
            return StatefulBuilder(
              builder: (context, setState) {
                return AlertDialog(
                  title: new Text("Alert!!"),
                  content: new Text(downloadMessage),
                  actions: <Widget>[
                    new FlatButton(
                      child: new Text("OK"),
                      onPressed: () {
                        Navigator.of(context).pop();
                      },
                    ),
                  ],
                );
              },
            );
          },
        );
      },

4

2 回答 2

0

您可以使用

状态生成器

小部件顶部的警报对话框并通过

设置状态

到你叫它的地方。

通过这种方式,您可以从外部访问 State。

于 2021-06-17T10:56:41.303 回答
0

正如我从您的问题中了解到的那样,您正在尝试为您的警报对话框设置不同的状态,因此我将更新您有关 alertDialog 的代码,之后您可以做您想做的事情。

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

因此,您可以将 setState 用于您想要的任何进度。

于 2021-06-17T10:59:53.163 回答