LateInitializationError: поле «пользователь» не было инициализировано

У меня проблема с начальным значением пользователя.

У меня есть исходники такого типа: "https:// paste.ofcode.org/ycHT4YFsDGSQXa68JiKJRH"

важные строки в ссылках:

  child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                Container(
                  height: 240,
                  child: FutureBuilder(
                      future: getCurrentUser(),
                      builder: (context, snapshot) {
                        return ListView.separated(
                          itemBuilder: (context, index) {
                            print(index);
                            return GetUserName(documentId: user?.uid);
                          },
                          separatorBuilder: (context, index) {
                            return SizedBox(width: 10);
                          },
                          itemCount: myCards.length,
                          shrinkWrap: true,
                          scrollDirection: Axis.horizontal,
                        );
                      }),

У меня тоже есть этот класс,

class GetUserName extends StatelessWidget {
  final String documentId;
  final int index = 0;

  GetUserName({
    required this.documentId,
  });

  @override
  Widget build(BuildContext context) {
    // get the collection
    CollectionReference users = FirebaseFirestore.instance.collection('Users');

    return FutureBuilder<DocumentSnapshot>(
      future: users.doc(documentId).get(),
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.done) {
          Map<String, dynamic> data =
              snapshot.data!.data() as Map<String, dynamic>;
          return MyCard(
            userName: data['username'],
            card: myCards[index],
          );
          //  Text('First Name: ${data['username']}');

        } else {
          print("here");
          return MyCard(
            userName: "Waiting",
            card: myCards[index],
          );
        }
        return Text('loading..');
      },
    );
  }
}

Я использую FutureBuilder в строке 90th, и его будущее значение равно getCurrentUser() эта функция создает это значение user = await _auth.currentUser;

и я даю параметр user?.uid в функции GetUserName в строке 96 (цель: дать текущий идентификатор пользователя для GetUserName).

Я успешно вижу текущее имя пользователя в MyCard, но также есть ошибка

======== Exception caught by widgets library =======================================================
The following LateError was thrown building:
LateInitializationError: Field 'user' has not been initialized.

Как я могу решить эту проблему ?

Каково значение user.uid в строке 96?

Dani3le_ 17.05.2022 13:38

Это пришло от пользователя = await _auth.currentUser; в начальном состоянии этот пользователь получает Текущего пользователя. И я использую user.uid в Futurebuilder.

hobik 17.05.2022 13:40
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
2
20
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте User? user вместо late final user, чтобы иметь возможность проверить нулевое значение до загрузки пользователя. И в вашем методе getCurrentUser(), когда пользователь извлекается, используйте setState для обновления пользователя и текущего состояния:

Future getCurrentUser() async {
  final loadedUser = await _auth.currentUser;

    if (loadedUser != null) {
      setState(() {
        user = loadedUser;
      });
    }
}

Спасибо за ваш ответ, но когда я использую это, я получаю ошибку в этой строке GetUserName(documentId: user?.uid); Ошибка: тип аргумента «Строка?» не может быть присвоен типу параметра «Строка».

hobik 17.05.2022 13:48

Затем вы выполняете нулевую проверку, что-то вроде этого: if(user != null){ return GetUserName(documentId: user!.uid); } else { return "Пользователь не найден"; }

SlowDeepCoder 17.05.2022 13:53

и когда я использую заданное состояние в стеке приложения getCurrentUser в цикле, Futurebuilder также вызывает этот пользовательский setState getCurrent, который все еще нужен?

hobik 17.05.2022 13:59

setState не нужен для Futurebuilder, и, поскольку getCurrentUser также вызывается только во время initState, setState вообще не нужен, вы правы. Также немного нелогично вызывать getCurrentUser как в initState, так и в Futurebuilder, только одного из них должно быть достаточно.

SlowDeepCoder 17.05.2022 14:07

Другие вопросы по теме