Нижеприведенный код Flutter Streambuilder запускается без ошибок и возвращает результат (скриншот внизу):
ID: AzFdOO9WsFaFbTxTQsuo
Data: Instance of '_JsonDocumentSnapshot'
Например, есть строковое поле под названием «имя», но я не могу понять, как к нему добраться.
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");
}
}
)
Спасибо за вашу помощь!
В вашем примере кода 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
.
надеюсь это поможет.
да, я этого совершенно не заметил, вы не указали тип снимка нигде в StreamBuilder, подождите, я отредактирую код
попробуйте теперь новый код StreamBuilder, я указал тип снимка, который он должен возвращать из потока
Это сделало это! Я никогда бы не подумал об этом. Для справки, мне пришлось использовать streamSnapshot.data?.data()
, но это действительно очень помогло. Я отмечу это как ответ. Спасибо!
Рад помочь вам, я рекомендую проверить это firebase.flutter.dev/docs/firestore/2.0.0_migration это может помочь.
Выглядит так просто, но когда я использую
streamSnapshot.data.data()
, я получаю волнистую ошибку: «Метод« данные »не определен для типа« Объект »». Есть идеи?