Firebase 如何使用StreamBuilder?
我尝试在我的项目中实现这段代码,下面是链接 这是我的脚手架Firebase 如何使用StreamBuilder?,firebase,flutter,dart,google-cloud-firestore,location,Firebase,Flutter,Dart,Google Cloud Firestore,Location,我尝试在我的项目中实现这段代码,下面是链接 这是我的脚手架 Scaffold( body: Center( child: Column( children: <Widget>[ FloatingActionButton( onPressed: () async { await GetusersLocation(); }
Scaffold(
body: Center(
child: Column(
children: <Widget>[
FloatingActionButton(
onPressed: () async {
await GetusersLocation();
},
child: Center(
child: Icon(
Icons.add,
),
),
),
StreamBuilder(
stream: stream,
builder: (BuildContext context,
AsyncSnapshot<List<DocumentSnapshot>> snapshots) {
if (snapshots.connectionState == ConnectionState.active &&
snapshots.hasData) {
print(snapshots.data);
return Container();
} else {
return Center(child: CircularProgressIndicator());
}
},
),
],
),
)),
脚手架(
正文:中(
子:列(
儿童:[
浮动操作按钮(
onPressed:()异步{
等待GetusersLocation();
},
儿童:中心(
子:图标(
Icons.add,
),
),
),
StreamBuilder(
小溪:小溪,
生成器:(BuildContext上下文,
异步快照(快照){
如果(snapshots.connectionState==connectionState.active)&&
快照(hasData){
打印(快照、数据);
返回容器();
}否则{
返回中心(子项:CircularProgressIndicator());
}
},
),
],
),
)),
这是我的GetusersLocation()
Future GetusersLocation()异步{
位置=等待地理定位器()
.getCurrentPosition(所需精度:定位精度高);
纬度=位置。纬度;
长=位置。经度;
}
这是我的initState()
溪流;
@凌驾
void initState(){
super.initState();
geo=GeoFire();
var半径=行为主体种子(1.0);
地理点中心=地理点(纬度:26.8462924,经度:81.0042322);
流=半径。开关映射((rad){
var collectionReference=_firestore.collection('locations');
返回geo.collection(collectionRef:collectionReference).in(
中心:中心,半径:弧度,字段:“位置”,模式:真);
});
}
我正在控制台上打印这个
[DocumentSnapshot实例、'DocumentSnapshot'实例、'DocumentSnapshot'实例、'DocumentSnapshot'实例、'DocumentSnapshot'实例、'DocumentSnapshot'实例、'DocumentSnapshot'实例]
请帮帮我。您有一个
文档快照的列表,这很正常,您的数据在文档快照中。
您可以在类似这样的列表视图中使用DocumentSnapshot
列表
StreamBuilder(
小溪:小溪,
生成器:(BuildContext上下文,
异步快照(快照){
如果(snapshots.connectionState==connectionState.active)&&
快照(hasData){
打印(快照、数据);
返回ListView.builder(
itemCount:snapshots.data.length,
itemBuilder:(构建上下文,int索引){
DocumentSnapshot doc=快照.数据[索引];
Map location=doc.data;//这是您的数据,可能是地图
返回文本(
location.toString(),
);
},
);
}否则{
返回中心(子项:CircularProgressIndicator());
}
},
),
嘿!非常感谢你回答这个问题,这对我很有用!但是我有一个问题,只有当我将代码(初始化流)放在initstate()中时,它才起作用。当我做了一个单独的函数,当按下一个按钮时调用它,我的控制台上什么也没有打印,没有警告或错误,什么都没有。只是好奇,为什么会发生这种情况?你能发布你的函数让我看看未来的getnearbyusers()异步{await GetusersLocation();geo=GeoFlatterFire();var radius=BehaviorSubject.seeded(1.0);GeoFirePoint center=geo.point(纬度:纬度,经度:长);stream=radius.switchMap((弧度){var collectionReference=_firestore.collection('locations');返回geo.collection(collectionRef:collectionReference)。在(中心:中心,半径:rad,字段:'position',stricmode:true);}您的函数没有返回流,并且没有setState eitheroh,嗯..但是它正在初始化流?我的意思是,初始化时是否需要始终返回流?
Future<void> GetusersLocation() async {
Position position = await Geolocator()
.getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
lat = position.latitude;
long = position.longitude;
}
Stream<List<DocumentSnapshot>> stream;
@override
void initState() {
super.initState();
geo = Geoflutterfire();
var radius = BehaviorSubject.seeded(1.0);
GeoFirePoint center = geo.point(latitude: 26.8462924, longitude: 81.0042322);
stream = radius.switchMap((rad) {
var collectionReference = _firestore.collection('locations');
return geo.collection(collectionRef: collectionReference).within(
center: center, radius: rad, field: 'position', strictMode: true);
});
}