如何实现CircularProgressIndicator对话框和“消息已发送!”扑扑中的对话?

时间:2020-10-03 08:00:15

标签: flutter dart flutter-web

我是新手,我希望获得有关如何实现CircularProgressIndicator对话框和“消息已发送!”的帮助。按下平面按钮时出现对话框。在这种情况下,我正在实现一个联系表单,供用户通过FirebaseFirestore.instance发送消息。我设置布尔值_isLoading并使用它触发CircularProgressIndicator的最初方法仅在发送消息后将其设置为false时才响应,而这种方法不起作用。结果,即使确认了消息已发送,我也得到了一个不会停止的CircularProgressIndicator。有人可以帮我解决这个问题吗?

                            FlatButton(
                              shape: RoundedRectangleBorder(
                                borderRadius: BorderRadius.circular(20),
                              ),
                              color: Colors.pinkAccent,
                              onPressed: () {
                                setState(() {
                                  _isLoading = true;
                                });
                                if (_isLoading) {
                                  showDialog(
                                      barrierDismissible: true,
                                      context: context,
                                      builder: (BuildContext context) {
                                        return Dialog(
                                          child: Container(
                                            height: _height * 0.09495,
                                            width: _width * 0.17644444,
                                            padding: EdgeInsets.only(
                                              top: 15,
                                            ),
                                            child: Center(
                                              child: Column(
                                                children: [
                                                  CircularProgressIndicator(),
                                                  Text('Please wait...'),
                                                ],
                                              ),
                                            ),
                                          ),
                                        );
                                      });
                                  if (_fbKey.currentState.saveAndValidate()) {
                                    FirebaseFirestore.instance
                                        .collection('message')
                                        .doc()
                                        .set({
                                      'name': _fbKey.currentState.value['name'],
                                      'email':
                                          _fbKey.currentState.value['email'],
                                      'details':
                                          _fbKey.currentState.value['details'],
                                      'category':
                                          _fbKey.currentState.value['category'],
                                      'created': FieldValue.serverTimestamp(),
                                    }).then((_) {
                                      print('Sent!');
                                    }).catchError((error) {
                                      print("Failed to send message: $error");
                                    });
                                  }
                                } else {
                                  showDialog(
                                      barrierColor: Colors.transparent,
                                      barrierDismissible: true,
                                      context: context,
                                      builder: (BuildContext context) {
                                        return Dialog(
                                          child: Container(
                                            height: _height * 0.09495,
                                            width: _width * 0.17644444,
                                            child: Center(
                                              child: Text(
                                                'Message sent2!',
                                                style: TextStyle(
                                                  color: Colors.green,
                                                  fontSize: 16,
                                                ),
                                              ),
                                            ),
                                          ),
                                        );
                                      });
                                }
                                setState(() {
                                  _isLoading = false;
                                });
                              },
                            ),
'''

1 个答案:

答案 0 :(得分:0)

您实际上不需要布尔值来显示和弹出对话框。如果我们了解异步功能和 await 调用,则可以轻松实现此逻辑。表单通过验证后,我们将显示“加载”对话框,然后等待firebase查询。当执行Firebase查询时,我们将使用try catch块查看它是否已捕获错误或成功执行。如果发现错误,我们将弹出对话框,打印错误,然后调用return,以便我们的方法终止。如果未发现任何错误,它将继续正常执行。我们将弹出此对话框并显示已发送消息对话框。

Subject_List = []
Subject = input("Please enter a subject")
Subject_List.append(Subject) #Lets say the user English. Therefore Subject_List = [English]