Как проверить, существует ли пользователь в облачном хранилище Firebase или нет в приложении флаттера, пока выполняется повторная регистрация? - PullRequest
0 голосов
/ 02 апреля 2020

Когда я пытаюсь проверить, существует ли конкретное число в коллекции Firebase или нет, я всегда получаю нулевое взамен. В чем причина?

Как я могу решить эту проблему, чтобы функция _numberCheck() возвращала логическое значение, которое я могу использовать для дальнейшей обработки?

Код страницы регистрации выглядит следующим образом:

    Future<bool> _numberCheck(mobileno) async {
    print("Start of the function");
    db
        .collection("transcriber_user_registeration")
        .getDocuments()
        .then((QuerySnapshot snapshot) {
      snapshot.documents.forEach((f) async {
        isPresent = true;
        isPresent = false;
        if ('${f.data['userid']}' == mobileno) {
          setState(() {
            isPresent = true;
          });
        } else {
          setState(() {
            isPresent = false;
          });
        }
      });
    });
//    print(isPresent);
    return isPresent;
  }

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

В вашем случае вы можете попробовать использовать запрос, который возвращает только значения, которые не равны нулю. Таким образом, в случае, если он не равен нулю, он вернет true, а если он будет нулевым, он вернет false.

Один из примеров того, как этого добиться - как лучше объяснено в этом другом вопросе из Сообщество здесь - вы можете использовать функцию hasAll(). Эта функция возвращает, только если присутствуют все значения. Таким образом, вы использовали бы его для загрузки всех значений в массив, проверяя таким образом, если они не равны NULL - что-то вроде приведенного ниже примера.

!resource.data.keys().hasAll(['mobileno'])

Существуют и другие примеры, такие как использование String для сравните значения с помощью функции where(), чтобы не получить нулевые значения. Более подробную информацию о выполнении запросов можно найти в по этой ссылке .

Я бы порекомендовал вам взглянуть на них и попробовать эти варианты, чтобы проверить, помогут ли они вам. :)

Дайте мне знать, помогла ли вам информация!

0 голосов
/ 02 апреля 2020

Ваша функция возвращает ноль, потому что вы возвращаете isPresent, не устанавливая его на true, вы устанавливаете только isPresent = false, что означает, что в противном случае isPresent будет нулевым, так как переменные содержат ссылки на объекты, поэтому они будут содержать null если вы не инициализировали его.

bool isPreset; // isPreset is null
isPreset = true; // isPreset is true
isPreset = false; // isPreset is false 

Если переменная не имеет значения, ее значение равно нулю. Всегда инициализируйте ваши переменные чем-либо.

Кроме того, если f.data['userid'] является строкой, вам не нужно снова делать ее строкой, заключив ее в '${}'

Измените свой код to:

Future<bool> _numberCheck(mobileno) async {
   QuerySnapshot snapshot = await db.collection("transcriber_user_registeration")
        .getDocuments();
     snapshot.documents.forEach((f) {
        if (f.data['userid'] == mobileno) {
          return false;
        }
      });

    return true;
  } 

И вызовите setState для результата этой функции, где вы ее вызываете. Или просто используйте FutureBuilder для непосредственного обращения с результатом и автоматического обновления sh вашего экрана.

Если он возвращает значение true, это означает, что результат сбора запроса является пустой коллекцией или if (f.data['userid'] == mobileno) никогда не true. Так что проверьте значения на обоих.

...