#firebase #flutter #google-cloud-firestore #stream
#firebase #флаттер #google-облако-firestore #поток
Вопрос:
Я борюсь с этим уже несколько дней:
static Future<List<Job>> getJobs() async {
double lat = await MySharedPreferences.instance.getDoubleValue('lat');
print(lat);
double long = await MySharedPreferences.instance.getDoubleValue('long');
print(long);
GeoFirePoint center = geo.point(latitude: lat, longitude: long);
var collectionReference = _firestore.collection('Job_data');
Stream<List<DocumentSnapshot>> stream = geo
.collection(collectionRef: collectionReference)
.within(center: center, radius: 50, field: 'position');
stream.listen((List<DocumentSnapshot> snapshot) {
for (int i = 0; i < snapshot.length; i ) {
jobtype.add(snapshot[i].data()['type']);
print(jobtype[i]);
}
});
}
}
class BodyLayout extends StatelessWidget {
@override
Widget build(BuildContext context) {
return _myListView(context);
}
}
Widget _myListView(BuildContext context) {
return ListView.builder(
itemCount: jobtype.length,
itemBuilder: (context, index) {
return ListTile(title: Text(jobtype[index]));
});
}
Я хочу показать результат Stream<List<DocumentSnapshot>>
потока в моем представлении списка.
Если я печатаю print(jobtype[i]);
, я вижу требуемые значения, поступающие из firebase, но пока я не нашел рабочего решения для добавления этих значений в представление списка. Я думаю, что мне нужен Streambuilder
, но у меня это не работает StreamList
. К сожалению, GeoFlutterFire возвращает только StreamList
.
Может кто-нибудь, пожалуйста, показать мне способ, как правильно отображать эти значения в виде списка? С моим текущим «решением» он показывает значения в моем представлении списка, но они двойные и загружаются неправильно.
Ответ №1:
Я смог заставить это работать, создав список из потока, а затем используя этот список с помощью ListView.builder
List<DocumentSnapshot> _newList = [];
Stream<List<DocumentSnapshot>> stream = geo
.collection(collectionRef: collectionReference)
.within(center: center, radius: 50, field: 'position');
stream.listen((List<DocumentSnapshot> snapshot) {
if (snapshot.length > 0){
_newList = snapshot;
}
});
.
.
.
.
ListView.builder(
itemCount: _newList.length,
itemBuilder: (BuildContext ctx, int index) {
return ListTile(
title: Text(_newList[index].data["name"]);
);
}
)