Я использую библиотеку GeoFlutterFire и следую коду в выпуск 16 , чтобы попытаться показать поток документов, соответствующих определенному Geoquery в Firebase. У меня все отлично, но я не могу понять, как взаимодействовать с потоком DocumentSnapshots, возвращенным в установленном мной Streambuilder:
Widget build(BuildContext context) {
return StreamBuilder(
stream: stream,
builder: (BuildContext context,
AsyncSnapshot<List<DocumentSnapshot>> snapshots) {
if (snapshots.connectionState == ConnectionState.active &&
snapshots.hasData) {
print('data ${snapshots.data}');
} else {
return Center(child: CircularProgressIndicator());
}
},
);
}
}
Возвращенный тип - AsyncSnapshot>, и мой оператор печати печатает правильно для консоли отладки , но я не знаю, как получить доступ к моим данным Firestore в этих экземплярах DocumentSnapshot. Я хочу построить список в этом виджете, который показывает список возвращенных документов Firestore, но я не могу перебрать snapshots
, если я не использую snapshots.data
, а затем я не могу использовать любые методы Firestore для for l oop для доступа к информации в полях моего документа.
for (var message in snapshots.data) {
print(message);
}
Может ли кто-нибудь помочь мне разобраться, как получить доступ к именам полей и данным в моих документах Firestore из этого Streambuilder, пожалуйста? Мой полный файл .dart ниже, с добавлением данных, обработанных в методе состояния init для добавления фиктивных данных в тест:
import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:geoflutterfire/geoflutterfire.dart';
import 'dart:async';
import 'package:rxdart/rxdart.dart';
final _firestore = Firestore.instance;
FirebaseUser loggedInUser;
Geoflutterfire geo = Geoflutterfire();
class ChatList extends StatefulWidget {
static const String id = 'chat_list';
@override
_ChatListState createState() => _ChatListState();
}
class _ChatListState extends State<ChatList> {
final _auth = FirebaseAuth.instance;
var stream;
@override
void initState() {
super.initState();
geo = Geoflutterfire();
GeoFirePoint myLocation = geo.point(latitude: 12.960632, longitude: 77.641603);
_firestore
.collection('locations')
.add({'name': 'random name', 'position': myLocation.data, 'sender':loggedInUser});
var radius = BehaviorSubject(seedValue: 1.0);
GeoFirePoint center = geo.point(latitude: 12.96, longitude: 77.64);
stream = radius.switchMap((rad) {
var collectionReference = _firestore.collection('locations');
return geo.collection(collectionRef: collectionReference).within(
center: center, radius: rad, field: 'position', strictMode: true);
});
}
Widget build(BuildContext context) {
return StreamBuilder(
stream: stream,
builder: (BuildContext context,
AsyncSnapshot<List<DocumentSnapshot>> snapshots) {
if (snapshots.connectionState == ConnectionState.active &&
snapshots.hasData) {
print('data ${snapshots.data}');
for (var sender in snapshots.data) {
print(sender);
}
return Container();
} else {
return Center(child: CircularProgressIndicator());
}
},
);
}
}