Flutter ProgressDialog 隐藏

标签 flutter progressdialog

我开发了一个 Flutter 应用程序,并使用了 ProgressDialog 小部件 (progress_dialog: ^1.2.0)。首先,我显示 ProgressDialog 小部件,在一些代码之后,我尝试隐藏 ProgressDialog。但它不起作用。

这是我的代码

class SignUp extends StatefulWidget {
  @override
  _SignUpState createState() => _SignUpState();
}

class _SignUpState extends State<SignUp> {

  @override
  Widget build(BuildContext context) {
    pr = new ProgressDialog(context,type: ProgressDialogType.Normal);
    pr.style(
      message: 'Sing Up .......',
      borderRadius: 20.0,
      backgroundColor: Colors.white,
      progressWidget: CircularProgressIndicator(),
      maxProgress: 1.0,
    );

    return Scaffold(
      backgroundColor: Color.fromRGBO(23, 63, 73, 1),
      appBar: AppBar(
        title: Text("Sign up"),
        backgroundColor: Colors.black,
      ),body: Stack(

        ......
        _addUser();

      ),
    );
  }

  Future _addUser() async {
    pr.show();

    .........

    pr.hide();
  }

}

之后我找到了解决这个问题的方法。

Future.delayed(Duration(seconds: 3)).then((value) {
  pr.hide();
});

但是为什么 ProgressDialog.hide() 在这里不起作用,但在延迟进程后却起作用?

最佳答案

当您的代码执行到 pr.hide() 时,progress_dialog 仍未显示在屏幕上
所以你的 pr.hide() 不起作用
你可以看到问题https://github.com/fayaz07/progress_dialog/issues/38
并检查 pr.isShowing() 将不起作用,因为在 Progress_dialog https://github.com/fayaz07/progress_dialog/blob/master/lib/progress_dialog.dart 的源代码中
bool _isShowing 领先于真正的 showDialog()
Progress_dialog 的代码片段

void show() {
    if (!_isShowing) {
      _dialog = new _Body();
      _isShowing = true;

      if (_showLogs) debugPrint('ProgressDialog shown');

      showDialog<dynamic>(
        context: _context,
        barrierDismissible: false,
        builder: (BuildContext context) {
          _dismissingContext = context;
          return WillPopScope(
            onWillPop: () {
              return Future.value(_barrierDismissible);
            },
            child: Dialog(
                backgroundColor: _backgroundColor,
                insetAnimationCurve: _insetAnimCurve,
                insetAnimationDuration: Duration(milliseconds: 100),
                elevation: _dialogElevation,
                shape: RoundedRectangleBorder(
                    borderRadius:
                        BorderRadius.all(Radius.circular(_borderRadius))),
                child: _dialog),
          );
        },
      );
    } else {
      if (_showLogs) debugPrint("ProgressDialog already shown/showing");
    }
  }
}

完整的测试代码

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:progress_dialog/progress_dialog.dart';

ProgressDialog pr;

void main() {
  runApp(MaterialApp(
    home: FirstScreen(),
  ));
}

class MyApp extends StatelessWidget {
  double percentage = 0.0;

  @override
  Widget build(BuildContext context) {
//    pr = new ProgressDialog(context,
//        type: ProgressDialogType.Normal, isDismissible: false);
    pr = new ProgressDialog(context, type: ProgressDialogType.Download);

    pr.style(
      message: 'Downloading file...',
      borderRadius: 10.0,
      backgroundColor: Colors.white,
      elevation: 10.0,
      insetAnimCurve: Curves.easeInOut,
      progress: 0.0,
      maxProgress: 100.0,
      progressTextStyle: TextStyle(
          color: Colors.black, fontSize: 13.0, fontWeight: FontWeight.w400),
      messageTextStyle: TextStyle(
          color: Colors.black, fontSize: 19.0, fontWeight: FontWeight.w600),
    );

    return Scaffold(
      body: Center(
        child: RaisedButton(
            child: Text(
              'Show Dialog',
              style: TextStyle(color: Colors.white),
            ),
            color: Colors.blue,
            onPressed: () {
              pr.show();

              Future.delayed(Duration(seconds: 2)).then((onvalue) {
                percentage = percentage + 30.0;
                print(percentage);

                pr.update(
                  progress: percentage,
                  message: "Please wait...",
                  progressWidget: Container(
                      padding: EdgeInsets.all(8.0),
                      child: CircularProgressIndicator()),
                  maxProgress: 100.0,
                  progressTextStyle: TextStyle(
                      color: Colors.black,
                      fontSize: 13.0,
                      fontWeight: FontWeight.w400),
                  messageTextStyle: TextStyle(
                      color: Colors.black,
                      fontSize: 19.0,
                      fontWeight: FontWeight.w600),
                );

                Future.delayed(Duration(seconds: 2)).then((value) {
                  percentage = percentage + 30.0;
                  pr.update(
                      progress: percentage, message: "Few more seconds...");
                  print(percentage);
                  Future.delayed(Duration(seconds: 2)).then((value) {
                    percentage = percentage + 30.0;
                    pr.update(progress: percentage, message: "Almost done...");
                    print(percentage);

                    Future.delayed(Duration(seconds: 2)).then((value) {
                      pr.hide().whenComplete(() {
                        print(pr.isShowing());
                      });
                      percentage = 0.0;
                    });
                  });
                });
              });

              Future.delayed(Duration(seconds: 10)).then((onValue) {
                print("PR status  ${pr.isShowing()}");
                if (pr.isShowing())
                  pr.hide().then((isHidden) {
                    print(isHidden);
                  });
                print("PR status  ${pr.isShowing()}");
              });
            }),
      ),
    );
  }
}

class FirstScreen extends StatefulWidget {
  @override
  _FirstScreenState createState() => _FirstScreenState();
}

class _FirstScreenState extends State<FirstScreen> {
  ProgressDialog pr;

  @override
  Widget build(BuildContext context) {
    pr = new ProgressDialog(context, showLogs: true);
    pr.style(message: 'Please wait...');

    return Scaffold(
      body: Center(
        child: RaisedButton(
          child: Text('Show dialog and go to next screen',
              style: TextStyle(color: Colors.white)),
          color: Colors.blueAccent,
          onPressed: () async{
            print("before pr show");
            pr.show();
            print("after pr show");
            print(pr.isShowing());
            pr.hide().whenComplete((){print("hide complete");}
            );
            print("after pr hide");
            print(pr.isShowing());
            /*Future.delayed(Duration(seconds: 3)).then((value) {
              pr.hide().whenComplete(() {
                Navigator.of(context).push(CupertinoPageRoute(
                    builder: (BuildContext context) => SecondScreen()));
              });
            });*/
          },
        ),
      ),
    );
  }
}

class SecondScreen extends StatefulWidget {
  @override
  _SecondScreenState createState() => _SecondScreenState();
}

class _SecondScreenState extends State<SecondScreen> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(child: Text('I am second screen')),
    );
  }
}

关于Flutter ProgressDialog 隐藏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59448216/

相关文章:

http - flutter 错误 : type 'AddressInfo' is not a subtype of type 'String' in type cast

firebase - 在flutter中使用2个where子句查询Firestore

java - 进度对话框异步任务花费的时间比预期的要长

Android ProgressDialog 显示但进度未更新

android - 如果 AsyncTask 需要时间,则显示 ProgressDialog

flutter - Dart 拆分整数并添加它们的值

flutter - 如何更改抽屉导航的工具栏颜色

flutter - 为什么要扩大而不是扩大高度

android - 关闭异步任务中的进度对话框

android - 我如何显示然后删除 android 进度对话框