Как получить значения внутри _JsonDocumentSnapshot?

Нижеприведенный код Flutter Streambuilder запускается без ошибок и возвращает результат (скриншот внизу):

ID: AzFdOO9WsFaFbTxTQsuo
Data: Instance of '_JsonDocumentSnapshot'

Как получить значения внутри _JsonDocumentSnapshot и отобразить их в виджете Text()?

Например, есть строковое поле под названием «имя», но я не могу понять, как к нему добраться.

StreamBuilder(
    stream: FirebaseFirestore.instance
                .collection("groceries")
                .doc(widget.docId)
                .snapshots(),
        builder: (context, streamSnapshot) {
            if (streamSnapshot.connectionState == ConnectionState.waiting) {
                return const Text("Loading");
            } else if (streamSnapshot.hasData) {
                return Text("ID: ${widget.docId}\n"
                            "Data: ${streamSnapshot.data}");
            } else {
                return const Text("No Data");
            }
        }
    )

Спасибо за вашу помощь!

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
210
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В вашем примере кода streamSnapshot.data — это переменная типа Object или dynamic.

Чтобы получить доступ к значению json ваших данных, вы должны указать ключ, соответствующий вашему значению.

streamSnapshot.data['banana']

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

следующие Stream возвращают объект с типом DocumentSnapshot :

FirebaseFirestore.instance.collection("groceries").doc(widget.docId).snapshots();

и этот тип содержит снимок документа, а также дополнительную информацию о документе.

поэтому, чтобы получить JSON Map<String, dynamic>, который представляет данные документа Firestore, вам нужно вызвать data() результат snapshot.data(), поэтому вам нужно попробовать следующее:

StreamBuilder<DocumentSnapshot>(
stream: FirebaseFirestore.instance
            .collection("groceries")
            .doc(widget.docId)
            .snapshots(),
    builder: (BuildContext context, AsyncSnapshot<DocumentSnapshot> streamSnapshot) {
        if (streamSnapshot.connectionState == ConnectionState.waiting) {
            return const Text("Loading");
        } else if (streamSnapshot.hasData) {
            return Text("ID: ${widget.docId}\n"
                        "Data: ${streamSnapshot.data.data()}"); // added data()
        } else {
            return const Text("No Data");
        }
    }
)

теперь он должен отображать объект Map<String, dynamic>, который содержит данные вашего документа в виджете Text.

надеюсь это поможет.

Выглядит так просто, но когда я использую streamSnapshot.data.data(), я получаю волнистую ошибку: «Метод« данные »не определен для типа« Объект »». Есть идеи?

SqueezeOJ 23.11.2022 18:15

да, я этого совершенно не заметил, вы не указали тип снимка нигде в StreamBuilder, подождите, я отредактирую код

Gwhyyy 23.11.2022 18:16

попробуйте теперь новый код StreamBuilder, я указал тип снимка, который он должен возвращать из потока

Gwhyyy 23.11.2022 18:17

Это сделало это! Я никогда бы не подумал об этом. Для справки, мне пришлось использовать streamSnapshot.data?.data(), но это действительно очень помогло. Я отмечу это как ответ. Спасибо!

SqueezeOJ 23.11.2022 18:19

Рад помочь вам, я рекомендую проверить это firebase.flutter.dev/docs/firestore/2.0.0_migration это может помочь.

Gwhyyy 23.11.2022 18:21

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