Ожидалось значение типа » Карта», но получено значение типа » () => Карта>?»

# #firebase #flutter #dart #google-cloud-firestore #flutter-web

Вопрос:

Я разрабатываю веб-приложение с помощью flutter, используя Firebase cloud firestore.

Я хочу получить значения из firestore, но возникает ошибка, и я не могу их получить.

Ошибка;

Ожидалось значение типа » Карта<Строка, динамическая>», но получено значение типа » () =<Строка, динамическая>> Карта<Строка, динамическая>><Строка, динамическая>?»

Код;

   Future<String> getData(String collection, String field) async {
    DocumentSnapshot docSnapshot =
        await FirebaseFirestore.instance.collection(collection).doc().get();
    Map<String, dynamic> record = docSnapshot.data as Map<String, dynamic>;
    return record[field];
  }


FutureBuilder(
              future: getData("users", "userName"),
              builder: (context, snapshot) {
                if (snapshot.connectionState != ConnectionState.done) {
                  return const SizedBox(
                    width: 50,
                    child: LinearProgressIndicator(),
                  );
                }

                if (snapshot.hasError) {
                  return SelectableText(snapshot.error.toString());
                }

                if (!snapshot.hasData) {
                  return const Text('No data found');
                }

                return Text('${snapshot.data}');
              },
            )
 

Этот код является FutureBuilder, который вызывает getData() и выводит на экран заявление об ошибке при возникновении ошибки.


После небольшого исследования я нашел способ избавиться от ошибки таким образом. код, подобный этому;

 Map<String,dynamic> record = new Map<String,dynamic>.from(docSnapshot.data["songs"]);
 

Однако это грамматически неверно и приведет к ошибке компиляции.
Firestore, похоже, сильно изменился с 2019 года по настоящее время, не в этом ли причина?

 docSnapshot.data["songs"]
 

Это не относится к DocumentSnapshot .

Кто-нибудь может устранить эту ошибку? Спасибо.

Дополнение 1;

Я изменил код, но произошла другая аналогичная ошибка. Первая ошибка устранена.

     Map<String, dynamic> record = docSnapshot.data() as Map<String, dynamic>;
 

Ожидалось значение типа » Карта<Строка, динамическая>», но получено значение типа
«Ноль»

Firestore подтвердил, что данные «Имя пользователя» были введены правильно.

Img1

Ответ №1:

Я считаю DocumentSnapshot.data , что это метод, поэтому вам следует изменить его на: DocumentSnapshot.data()

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

1. Так и должно быть docSnapshot.data.data() .

2. Спасибо за ваш ответ, я изменил код, но произошла другая ошибка. Я отредактировал вопрос.

3. @Mudassir Привет, где их написать? В моем окружении, data конечно docSnapshot , нет data() метода.

4. Хорошо, я считаю, что происходит вот что: FirebaseFirestore.instance.collection(collection).doc() получите collection коллекцию и создайте в ней новый документ, после этого вы получите документ и попытаетесь получить его данные, которые пусты, поэтому data() возвращает значение null.

5. Почему я получаю пустые данные? Изображение, о котором идет речь, показывает, что у него есть поле в документе uid. Если у вас есть время, пожалуйста.