Ошибка LateInitializationError: Поле не было инициализировано.’ .затем() команда не выполняется после выполнения запроса firebase в FutureBuilder

#flutter #future #flutter-futurebuilder

Вопрос:

Я пытаюсь получить снимок Firestore, и мой код, похоже, не работает. Я убедился fireUser.uid , что все работает, и он напечатал правильный идентификатор, но, как ни странно, мой .then() код вообще не работает, я его вставил print('then') и не появляется на моей консоли

именно здесь происходит ошибка:

 FutureBuilder(
      future: Future.wait([
      DatabaseService.getUserDataFromFirestore(FirebaseAuth.instance.currentUser!),
      GeoService.getPosition(),
      ]),
      builder: (context, snap) {
        if (snap.connectionState == ConnectionState.done) {
          return Frame();
        }
        else return Container(
          color: Colors.black,
          child: Center(
            child: spinKit,
          ),
        );
      }
    );
 

Будущее с ошибкой:

 static Future<Userdata> getUserDataFromFirestore (User fireUser) async {
    await usersRef.doc(fireUser.uid).get().then((val) {
      print('then');
      userdata = Userdata.fromDoc(val);
    });
    return userdata;
  }
 

сообщение об ошибке:

 LateInitializationError: Field 'userdata' has not been initialized.
 

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

1. Вы уверены, что ошибка исходит от return userdata линии?

2. нет, ошибка возникает позже в моем коде, когда я пытаюсь использовать «данные пользователя», извините, я не очень ясно выразился по этому поводу

3. late следует использовать только в том случае, если вы можете логически гарантировать, что инициализируете userdata его до его использования. Если вы не можете предоставить эту гарантию, сделайте ее недействительной и проверьте null значение везде, где вы ее используете.

4. он всегда должен быть инициализирован, этот код работал для меня и раньше, но внезапно, когда я открыл flutter сегодня, он перестал работать. Я думаю, что проблема в том, откуда «.then ()», потому что этот код вообще не запускается

5.В использовании нет ничего плохого .then (кроме того, что это плохой стиль для смешивания .then await ). Однако для инициализации вы полагаетесь на асинхронную операцию userdata , что является плохой идеей для late переменных , поскольку это предоставляет больше возможностей для доступа к ней до ее инициализации. Вы не видите срабатывания обратного вызова, потому что вы получаете доступ userdata и запускаете его LateInitializationError до выполнения обратного вызова.

Ответ №1:

Тогда у меня была другая проблема, как я думал. Firestore, должно быть, был обновлен, потому что правила моей базы данных Firestore заблокировали меня, поэтому я обновил правила, и теперь мой код работает нормально. Большое спасибо за помощь

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

1. К вашему сведению, это, LateInitializationError скорее всего, указывает на отдельную проблему, которая была выявлена Future из-за того, что вы не завершили. То есть, если вы не исправите это, это может повториться, если это Future когда-нибудь займет больше времени, чем обычно.