Flutter中如何将GeoFlutterFire返回的Stream快照转为自定义类List
实现方案
首先需要给你的AppClient模型类新增Firestore文档转换的工厂方法,再根据你的业务场景选择对应的转换方式即可。
步骤1:新增模型类转换方法
给AppClient新增工厂构造方法,属性请匹配你自己的AppClient定义调整:
factory AppClient.fromFirestore(DocumentSnapshot<Map<String, dynamic>> doc) { Map<String, dynamic> data = doc.data() ?? {}; return AppClient( // 文档ID id: doc.id, // 示例字段,按需替换为你实际的字段 name: data['name'] ?? '', latitude: data['latitude'] as double? ?? 0.0, longitude: data['longitude'] as double? ?? 0.0, // 其他字段依次赋值 ); }
提示:如果需要过滤无效/不存在的文档,可以在后续转换前加
.where((doc) => doc.exists)过滤。
方式1:保持原方法返回Future类型(仅拉取一次当前范围内的结果)
直接修改getClientList方法如下:
Future<List<AppClient>> getClientList() async{ final GeoFirePoint center = _geo.point(latitude: 44.414445, longitude: 26.01135501); final CollectionReference<Map<String, dynamic>> collectionReference = _firestore.collection('clients/London/Beauty'); final double radius = 5000; const String field = 'point'; final Stream<List<DocumentSnapshot<Map<String, dynamic>>>> stream = _geo.collection(collectionRef: collectionReference).within(center: center, radius: radius, field: field); // 取Stream第一个快照完成转换 final snapshotList = await stream.first; final result = snapshotList.map((doc) => AppClient.fromFirestore(doc)).toList(); return result; }
方式2:改为返回Stream类型(实时监听数据变化,适合UI实时更新场景)
如果你的页面需要实时响应范围内地点的新增、修改、删除,建议改成返回Stream,方法调整如下:
Stream<List<AppClient>> getClientListStream() { final GeoFirePoint center = _geo.point(latitude: 44.414445, longitude: 26.01135501); final CollectionReference<Map<String, dynamic>> collectionReference = _firestore.collection('clients/London/Beauty'); final double radius = 5000; const String field = 'point'; return _geo.collection(collectionRef: collectionReference) .within(center: center, radius: radius, field: field) // 直接对Stream做转换 .map((snapshotList) => snapshotList.map((doc) => AppClient.fromFirestore(doc)).toList()); }
使用时可以直接用StreamBuilder监听这个流渲染UI即可。
内容的提问来源于stack exchange,提问作者FLTY
相关产品推荐
相关产品推荐

