Как заменить элементы firebase flutter

#android #firebase #flutter #google-cloud-firestore #null

#Android #firebase #flutter #google-облако-firestore #null

Вопрос:

Я разрабатываю приложение Flutter, которое использует Firebase в качестве серверной части. В моем облачном Firestore у меня есть две коллекции: football (она содержит один документ) и upcomingteams.
Поля документа в football:

    -Строка currentTeam1

    -Строка currentTeam2

    -Строка upcomingTeam1

    -Строка upcomingTeam2

    -int team1Score

    -int team2Score

Поля документов в предстоящих командах:

    -Временная метка, созданная в строке upcomingTeam1 — Строке upcomingTeam2
    В моем приложении у меня есть кнопка, которая устанавливает нулевые результаты в конце матча. После того, как он установит оценки, я хочу, чтобы он выполнил следующее:

  • В документе football поместите значение upcomingTeam1 в currentTeam1, и то же самое с командой 2
  • Из предстоящих команд скопируйте команды и поместите значения в поля football documents upcomingTeam1 и upcomingTeam2

Чтобы достичь этого, я считаю, что первым шагом является получение upcomingTeam1 и upcomingTeam2 из документа football. Для этого я написал следующую функцию, которая назначается в свойстве onTap соответствующей кнопки:

 void _nextMatch() {
    UpcomingMatch upcomingMatch;
    Firestore.instance
        .collection('football')
        .document("cMrD3OoOsWuzJmzlpfsr")
        .get()
        .then((DocumentSnapshot documentSnapshot) {
      if (documentSnapshot.exists) {
        upcomingMatch = UpcomingMatch(
            documentSnapshot.data["nextTeam1"].toString(),
            documentSnapshot.data["nextTeam2"].toString());
        print(documentSnapshot.data["nextTeam1"].toString());
        print(documentSnapshot.data["nextTeam2"].toString());
      }
    });
    if (upcomingMatch.upcomingTeam1.isNotEmpty amp;amp; upcomingMatch.upcomingTeam2.isNotEmpty) {
      Firestore.instance
          .collection("football")
          .document("cMrD3OoOsWuzJmzlpfsr")
          .updateData({
        "currentTeam1": upcomingMatch.upcomingTeam1,
        "currentTeam2": upcomingMatch.upcomingTeam2,
      });
    }
  }
  

Но для этого я получаю следующую ошибку:

 I/flutter ( 8687): The following NoSuchMethodError was thrown while handling a gesture:
I/flutter ( 8687): The getter 'upcomingTeam1' was called on null.
I/flutter ( 8687): Receiver: null
I/flutter ( 8687): Tried calling: upcomingTeam1
I/flutter ( 8687):
I/flutter ( 8687): When the exception was thrown, this was the stack:
I/flutter ( 8687): #0      Object.noSuchMethod (dart:core-patch/object_patch.dart:51:5)
I/flutter ( 8687): #1      _MainPageState._nextMatch (package:foci_dev/pages/main_page.dart:178:23)
I/flutter ( 8687): #2      _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:992:19)
I/flutter ( 8687): #3      _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:1098:38)
I/flutter ( 8687): #4      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:184:24)
I/flutter ( 8687): #5      TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:524:11)
I/flutter ( 8687): #6      BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:284:5)
I/flutter ( 8687): #7      BaseTapGestureRecognizer.acceptGesture (package:flutter/src/gestures/tap.dart:256:7)
I/flutter ( 8687): #8      GestureArenaManager.sweep (package:flutter/src/gestures/arena.dart:158:27)
I/flutter ( 8687): #9      GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:224:20)
I/flutter ( 8687): #10     GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:200:22)
I/flutter ( 8687): #11     GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:158:7)
I/flutter ( 8687): #12     GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:104:7)
I/flutter ( 8687): #13     GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:88:7)
I/flutter ( 8687): #17     _invoke1 (dart:ui/hooks.dart:267:10)
I/flutter ( 8687): #18     _dispatchPointerDataPacket (dart:ui/hooks.dart:176:5)
I/flutter ( 8687): (elided 3 frames from dart:async)
I/flutter ( 8687):
I/flutter ( 8687): Handler: "onTap"
I/flutter ( 8687): Recognizer:
I/flutter ( 8687):   TapGestureRecognizer#acb21
  

Если я правильно интерпретирую это, это означает, что свойство upcomingTeam1 для upcomingMatch не назначено. Я попытался преобразовать функцию в async и добавить ключевое слово await перед запросом, но это не помогло.
Заранее спасибо за ответы!

Ответ №1:

Включите обновление в свой then блок, чтобы предстоящее соответствие имело значение:

 void _nextMatch() {
  UpcomingMatch upcomingMatch;
  Firestore.instance
      .collection('football')
      .document("cMrD3OoOsWuzJmzlpfsr")
      .get()
      .then((DocumentSnapshot documentSnapshot) {
        if (documentSnapshot.exists) {
          upcomingMatch = UpcomingMatch(
              documentSnapshot.data["nextTeam1"].toString(),
              documentSnapshot.data["nextTeam2"].toString());
          print(documentSnapshot.data["nextTeam1"].toString());
          print(documentSnapshot.data["nextTeam2"].toString());
        }
        if (upcomingMatch.upcomingTeam1.isNotEmpty amp;amp;
          upcomingMatch.upcomingTeam2.isNotEmpty) {
            Firestore.instance
            .collection("football")
            .document("cMrD3OoOsWuzJmzlpfsr")
            .updateData({
              "currentTeam1": upcomingMatch.upcomingTeam1,
              "currentTeam2": upcomingMatch.upcomingTeam2,
            });
        }
      });
}