【问题标题】:How to dismiss a Dialog alert widget automatically in Flutter?如何在 Flutter 中自动关闭对话框警报小部件?
【发布时间】:2020-03-19 15:52:03
【问题描述】:

如果这是一个菜鸟问题或代码看起来太基本,请原谅我,我是新手。 我已经完成了相当多的谷歌搜索,但我还没有找到解决方案。

一旦未来功能启动,我想显示加载警报。处理 API 请求/响应时,如果发生错误,应在 showErrorDialog 中显示,并且 LoadingDialog 应自动关闭。

现在,ErrorDialog 显示并可以使用其按钮将其关闭,但 LoadingDialog 不会被关闭。

我可以使用 Future.delayed 来做到这一点,但这只是一种解决方法,它有太多可变的结果。这是虚拟代码:

import 'package:flutter/material.dart';

class RandomScreen extends StatefulWidget {
  @override
  _RandomScreenState createState() => _RandomScreenState();
}

class _RandomScreenState extends State<RandomScreen> {

  Future<void> _submitApiRequest() async {
    try {
      _showLoadingAlert();

      //processing the API request/response here.

    } catch (error) {
      _showErrorDialogue(error.toString());
    }
  }

  void _showErrorDialogue(String errorMessage) {
    showDialog(
      context: context,
      builder: (ctx) => Dialog(
        shape: RoundedRectangleBorder(
          borderRadius: BorderRadius.circular(20.0),
        ),
        child: Column(
          children: <Widget>[
            Text(errorMessage),
            FlatButton(
              onPressed: () => Navigator.of(context).pop(),
              child: Text(
                'Dismiss',
              ),
            ),
          ],
        ),
      ),
    );
  }

  void _showLoadingAlert() {
    showDialog(
      context: context,
      builder: (ctx) => CircularProgressIndicator(),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Random Screen'),
      ),
      body: Center(
        child: RaisedButton(
          onPressed: _submitApiRequest,
          child: Text('Submit'),
        ),
      ),
    );
  }
}

【问题讨论】:

  • 相关,请检查答案。 stackoverflow.com/a/60760433/7532298
  • 哇,我所要做的就是在显示下一个对话框之前弹出它。很高兴看到我只是想多了。谢谢@SumanMaharjan,这解决了我的问题。
  • 如果解决了就接受这个答案:D
  • 当然,我做到了,但我的声誉还很低,所以它不会显示

标签: flutter flutter-dialog


【解决方案1】:

如果您尝试调用 API 并显示加载屏幕,您尝试执行的方式可能不是最佳方式。我建议你使用ModalProgressHud

这将在您尝试进行 API 调用时显示加载程序,一旦收到 API 响应,您可以使用状态变量隐藏加载程序。

如果您仍想使用警报框, 您需要按照documentation 中的说明调用 Navigator.pop。

如果应用程序有多个 Navigator 对象,可能需要调用 Navigator.of(context, rootNavigator: true).pop(result) 而不仅仅是 Navigator.pop(context, result) 来关闭对话框。

【讨论】:

  • 我已经在某处看到过这个答案,而且这种方法似乎有点过于复杂。 @Suman Maharjan 对我的问题的评论为我的案例提供了最佳解决方案。感谢您抽出宝贵时间回复:)
猜你喜欢
  • 1970-01-01
  • 2020-06-30
  • 2018-04-11
  • 2020-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多