如何在Flutter中自动关闭对话框警报小部件?

时间:2020-03-19 15:52:03

标签: flutter flutter-dialog

请原谅我,如果它是一个菜鸟问题或代码似乎太基本了,那么我是新手。 我已经完成了大部分的谷歌搜索工作,但是还没有找到解决方案。

将来的功能启动后,我想显示“正在加载”警报。处理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'),
        ),
      ),
    );
  }
}

1 个答案:

答案 0 :(得分:0)

在尝试调用API并显示加载屏幕的情况下,您尝试的方法可能不是最好的方法。我建议您使用ModalProgressHud

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

如果您仍然想使用警报框, 您需要按documentation中所述调用Navigator.pop。

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