【问题标题】:Flutter : Show an Alert Dialog after an async Api callFlutter:在异步 Api 调用后显示警报对话框
【发布时间】:2018-08-14 12:56:38
【问题描述】:

这是获取登录响应的代码。如果出现错误,我想显示一个警告对话框,说明登录期间出现错误。

Future<String> login(String username, String password) async {
    Map<String, dynamic> params = {
       'username': username,
       'password': password,
    };

    final response = await http.post('apiurl', body: params);

    if (response.statusCode != 200)
       throw Exception(response.body);

    return response.body;
}

我正在添加调用 login 的代码。 _loginController 中有一个 TODO,我想在其中显示一个显示错误的警报对话框。

class LoginWidgetState extends State<LoginWidget> {
  var _usernameController = new TextEditingController();

  var _passwordController = new TextEditingController();

  void _loginButtonClickHandler() {
    var username = _usernameController.text;
    var password = _passwordController.text;

    login(username, password).then((response) {

    }).catchError((e) {
      //TODO : show an Alert Here
    });
  }

  @override
  Widget build(BuildContext context) {
    var container = Center(
      child: Container(
    child: Column(
      children: <Widget>[
        TextField(
          decoration: InputDecoration(
            hintText: "username",
          ),
          controller: _usernameController,
        ),
        TextField(
          obscureText: true,
          decoration: InputDecoration(hintText: "password"),
          controller: _passwordController,
        ),
        RawMaterialButton(
          onPressed: _loginButtonClickHandler,
          child: Text("Login"),
        )
       ],
     ),
    ),
   );

   return container;
  }

}

【问题讨论】:

    标签: flutter flutter-layout


    【解决方案1】:

    为已接受的答案提供更多上下文...

    如果您进行远程 API 调用,例如 this

    login(username, password).then((response) {
    
    }).catchError((e) {
      //TODO : show an Alert Here
    });
    

    然后您可以用这个替换 TODO(如果您通过单击按钮调用它):

    _showAlertDialog(context);
    

    或者这个(如果你在 build() 方法或 initState() 中调用它:

    WidgetsBinding.instance.addPostFrameCallback((_) => _showAlertDialog(context));
    

    其中方法定义为

    void _showNewVersionAvailableDialog(BuildContext context) {
      final alert = AlertDialog(
        title: Text("Error"),
        content: Text("There was an error during login."),
        actions: [FlatButton(child: Text("OK"), onPressed: () {})],
      );
    
      showDialog(
        context: context,
        builder: (BuildContext context) {
          return alert;
        },
      );
    }
    

    注意事项

    • 您需要引用BuildContext
    • 有关 addPostFrameCallback 的更多信息,请阅读this article

    【讨论】:

    • 这很棒。非常感谢
    【解决方案2】:

    请参阅here 以显示对话框。

    发送context_loginButtonClickHandler 就完成了。干杯

    【讨论】:

      【解决方案3】:

      您可以为此使用 RFlutter Alert 库。它是 Flutter 易于定制且易于使用的警报/弹出对话框库。希望对你有帮助。

      使用 RFlutter Alert 的示例警报:

      Alert(context: context, title: "RFLUTTER", desc: "Flutter is awesome.").show();
      

      *我是 RFlutter Alert 的开发者之一。

      【讨论】:

        【解决方案4】:

        这对你有帮助!

          Future<String> login(String username, String password) async {
            Map<String, dynamic> params = {
               'username': username,
               'password': password,
            };
        
            final response = await http.post('apiurl', body: params);
        
            if (response.statusCode != 200)
            {
              throw Exception(response.body);
            }
            else 
            {
              showWhateverFunction();
            }
            return response.body;
        }
        

        【讨论】:

        • 我想要一个通用的方法来进行 Api 调用。在这种情况下,我只想抛出异常并将其留给调用者进行相应的处理。
        • 然后试试try catch!
        • 我已经扔了。我只需要完成 TODO 部分
        猜你喜欢
        • 2021-01-17
        • 2021-08-14
        • 2020-03-21
        • 2021-01-30
        • 2020-08-21
        • 1970-01-01
        • 2023-03-13
        • 2020-01-14
        • 1970-01-01
        相关资源
        最近更新 更多