Не удается отключить showdialog с помощью setstate flutter

#flutter #setstate #showdialog

#flutter #setstate #showdialog

Вопрос:

Я хочу проверить, есть ли номер телефона, который вводит пользователь, в firebase, поэтому я использую ShowDialog для отображения счетчика, я хочу отклонить showdialog, если этот номер телефона уже существует. Я пробовал setState на, но showddialog не будет автоматически отключен.

 _phoneExist(phone) {
    if (loading) {
      showDialog(
          context: context,
          builder: (c) {
            return Center(
              child: SpinKitChasingDots(
                color: Colors.brown,
                size: 50.0,
              ),
            );
          });
    }
    firestoreInstance
        .collection("partners")
        .where("phone", isEqualTo: phone)
        .getDocuments()
        .then((value) {
      value.documents.forEach((result) {
        if (result.exists) {
          print(result['phone']);
          setState(() {
            _userExist = true;
            loading = false;
          });
        } else {
          print('ghhgghgh');
        }
      });
    });

    if (_userExist) {
      Scaffold.of(context).showSnackBar(snackBar2('$phone Aleady Exists'));
      setState(() {
        _userExist = false;
      });
    } else {
      print('gghhgghgchgc');
      print(phone);
      // _registerUser();
    }
  }
 

Комментарии:

1. Пожалуйста, проверьте мой ответ

Ответ №1:

Вы можете попробовать с приведенными ниже строками

       BuildContext buildContext;

     _phoneExist(phone) {
      if (loading) {
        showDialog(
            context: context,
            builder: (BuildContext context) {
              buildContext = context;   // Assign your context to buildcontext
              return Center(
                child: SpinKitChasingDots(color: Colors.brown,size: 50.0,
                ),
              );
            });
      }
      firestoreInstance
          .collection("partners").where("phone", isEqualTo: phone).getDocuments()
          .then((value) {
        value.documents.forEach((result) {
          if (result.exists) {
            setState(() {
              _userExist = true;
              loading = false;

              
                  SchedulerBinding.instance.addPostFrameCallback((_) {
                       Navigator.pop(buildContext);
                  });  // By adding this you can close your pop up


            });
          } else {
          }
        });
      });
  
      if (_userExist) {
        Scaffold.of(context).showSnackBar(snackBar2('$phone Aleady Exists'));
        setState(() {
          _userExist = false;
        });
      } else {
        // _registerUser();
      }
    }
 

Комментарии:

1. Спасибо, но я отправляю эту ошибку ‘package:flutter /src / widgets /navigator.dart’: Ошибка утверждения: строка 4041 поз 12: ‘!_debugLocked’: неверно.

2. @Godwin пожалуйста, перепроверьте мой ответ, я обновил свой ответ

3. @Godwin Если этот ответ сработал для вас, пожалуйста, проголосуйте и отметьте как true для этого ответа Спасибо

Ответ №2:

Чтобы скрыть диалоговое окно, вы можете использовать:

 Navigator.pop(context);
 

Если в вашем приложении есть несколько объектов Navigator, вы можете использовать:

 Navigator.of(context, rootNavigator: true).pop();
 

Вы можете ознакомиться с документами здесь: https://api.flutter.dev/flutter/material/showDialog.html