当警报对话框将关闭时,如何弹出屏幕(返回上一个屏幕)?

时间:2021-06-06 16:15:09

标签: flutter dart

我有问题。当警报对话框关闭时,我想弹出屏幕(主上下文)。 所以这是怎么回事:

  1. 用户做了一些工作。
  2. 警报对话框已打开
  3. 它打开了 3 秒。
  4. 警报对话框已关闭
  5. 我们将用户移至主屏幕(EmailPage 对我而言)

整体方法:

Future<void> _sendMessageToSupport() async {
    final body = {
      'email': emailController.text, //
      'topic': topicController.text, //
      'message': contentController.text,
    };
    final jsonString = json.encode(body);
    final uri =
        Uri.http(AppConstants.BASE_URL, AppConstants.SUPPORT_CONTACT_ENDPOINT);
    final headers = {HttpHeaders.contentTypeHeader: 'application/json'};
    _setRefreshProgressIndicator(true);
    await http.post(uri, headers: headers, body: jsonString);
    _setRefreshProgressIndicator(false);
    showDialog(
      barrierDismissible: false,
      context: context,
      builder: (context) {
        Future.delayed(
          Duration(seconds: 3),
          () {
            Navigator.of(context).pop(true);
            /*Navigator.push(context,
                new MaterialPageRoute(builder: (context) => EmailPage()));*/ //navigates to EmailPage rather than pop to it
          },
        );
        return AlertDialog(
          title: Text(
            'blabla',
            style: TextStyle(
              fontSize: 18,
              color: Color(0xff000000),
            ),
            textAlign: TextAlign.center,
          ),
        );
      },
    );
  }

我们从 EmailPage 移至此屏幕(假设为 A 屏幕)。用户做员工,我们应该自动回到EmailPage。我是这样做的:

Future.delayed(
          Duration(seconds: 3),
          () {
            Navigator.of(context).pop(true);
            /*Navigator.push(context,
                new MaterialPageRoute(builder: (context) => EmailPage()));*/ //navigates to EmailPage rather than pop
          },
        );

但问题是我们通过推送新屏幕将用户移动到 EmailPage,然后当他点击应用栏上的后退箭头时,他再次移动到屏幕 A。

你能告诉我我该怎么做吗?我的意思是,我知道我需要从构建方法的上下文中弹出,但是如何弹出?当我做这样的事情时(在方法末尾弹出):

builder: (context) {
        Future.delayed(
          Duration(seconds: 3),
          () {
            Navigator.of(context).pop(true);
            /*Navigator.push(context,
                new MaterialPageRoute(builder: (context) => EmailPage()));*/ //navigates to EmailPage rather than pop
          },
        );
        return AlertDialog(
          title: Text(
            'Wysłano zapytanie do supportu. Postaramy się odpowiedzieć jak najszybciej!',
            style: TextStyle(
              fontSize: 18,
              color: Color(0xff000000),
            ),
            textAlign: TextAlign.center,
          ),
        );
      },
    );
    Navigator.of(context).pop(true);
  }

然后甚至没有显示弹出窗口。

2 个答案:

答案 0 :(得分:0)

enter image description here

如果这不是您要找的,请告诉我。

class EmailPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('EmailPage')),
      body: Center(
        child: ElevatedButton(
          onPressed: () => Navigator.push(context, MaterialPageRoute(builder: (_) => PageA())),
          child: Text('Go to Page A'),
        ),
      ),
    );
  }
}

class PageA extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('PageA')),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            Timer(Duration(seconds: 3), () {
              Navigator.pop(context); // Dismisses dialog
              Navigator.pop(context); // Navigates back to previous screen
            });

            showDialog(
              context: context,
              builder: (_) => AlertDialog(
                title: Text('Dialog'),
                content: Text('Dismissing in 3s'),
              ),
            );
          },
          child: Text('Show Dialog'),
        ),
      ),
    );
  }
}

答案 1 :(得分:0)

警报对话框返回一个在对话框关闭时运行的未来,因此您可以订阅该未来并在该未来中使用您的弹出代码。 / 这是一个简单的例子来展示

RaisedButton(
        onPressed: () {
          showDialog(
              context: context,
              builder: (context) => AlertDialog(
                    title: Text('Are you sure?'),
                    content: Text('Do you want to remove item?'),
                    actions: <Widget>[
                      FlatButton(
                          onPressed: () => Navigator.of(context).pop('Success'),
                          child: Text('NO')),
                      FlatButton(
                          onPressed: () => Navigator.of(context).pop('Failure'),
                          child: Text('YES'))
                    ],
                  )).then((value) =>
              print('Result: ' + value.toString()));
        },
        child: Text('Show Alert Dialog'),
      ),