我做了一個函式,我想回傳我的資料庫中所有在一個半徑內的地方。這就是為什么我使用GeoFlutterFire。我的問題是,我不知道如何將Stream<List<DocumentSnapshot<Map<String, dynamic>>>轉換成我的Class型別的List<>。
uj5u.com熱心網友回復: 由于 另外,你可以使用一個流構建器來監聽該流。就像這樣。 uj5u.com熱心網友回復: 流媒體真的很有用,并且提供了,開箱即用的,很多優雅的解決方案。
在你的案例中,我將使用StreamTransformer來做這樣的事情: 在你的案例中,我將使用StreamTransformer來做這樣的事情。
你可以用Streams和StreamTransformers做更多的事情,使你的代碼更容易閱讀和除錯,而且,更漂亮。關于StreamTransformers的檔案。
https://api.flutter.dev/flutter/dart-async/StreamTransformer-class.html
標籤:。
import 'package:cloud_firestore/cloud_firestore.dart'/span>。
import 'package:geoflutterfire/geoflutterfire.dart';
import 'package:firebase_auth/firebase_auth.dart'。
import 'package:fiilbase_storage/firebase_storage.dart';
import 'package:uerto/models/index.dart';
class SearchApi{
const SearchApi({required FirebaseAuth auth, required FirebaseFirestore firestore, required FirebaseStorage storage, required Geoflutterfire geo})
: _auth = auth,
_firestore = firestore,
_storage = 存盤。
_geo = geo。
final FirebaseAuth _auth;
final FirebaseFirestore _firestore;
final FirebaseStorage _storage;
final Geoflutterfire _geo;
Future<List<AppClient>> getClientList() async{
final List<AppClient> newResult = <AppClient> []。
final GeoFirePoint center = _geo.point(latitude: 44.414445, longitude: 26.01135501);
final CollectionReference<Map<String, dynamic> > collectionReference = _firestore. collection('client/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)。
//something to transform Stream<List<DocumentSnapshot<Map<String, dynamic> >>>流進入List<AppClient> result;
newResult.addAll(result)。
return newResult。
}
stream.listen((List< DocumentSnapshot> documentList) {
//此函式將在documentList發生變化時被呼叫。
//所以,即使在你的getClientsList()完成后,它也可能被呼叫。
List<Map<String, dynamic> > newResult = documentList。 map((e) => e.data()).toList()。
});
getClientsList回傳一個future,你可能想把流轉換為future。在這種情況下,你可以使用這個。List<Map< String, dynamic>> newResult = (await stream. first).map((e) => e.data()).toList()。
StreamBuilder<DocumentSnapshot>(
流。_geo.collection(collectionRef: collectionReference)
.within(center: center, radius: radius, field: field)。
builder:
(BuildContext context, AsyncSnapshot< DocumentSnapshot> snapshot) {
if (snapshot.hasError) return Text(' Something went wrong');
if (snapshot.connectionState == ConnectionState.waiting)
return CircularProgressIndicator()。
List<Map<String, dynamic>> newResult = snapshot.data.data()。
print(newResult)。
return SizedBox()。
},
)
Stream<CustomType> stream = _geo.collection(collectionRef: collectionReference)
.within(center: center, radius: radius, field: field)
.transform(StreamTransformer.fromHandlers(handleData: (docSnap, sink) {
if (docSnap.existence) {
sink.add(<將docSnap欄位轉換為CustomType here>)。
}
}));
