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);
    });
  }