Firebase 如何使用streambuilder中的数据更新listview

Firebase 如何使用streambuilder中的数据更新listview,firebase,flutter,dart,google-cloud-firestore,stream-builder,Firebase,Flutter,Dart,Google Cloud Firestore,Stream Builder,我有一个带有streambuilder的小部件,可以从firebase获取数据。我想在另一个小部件中的listview中显示此数据,但它不会显示在listview中。这是我的密码: Widget _buildStream(BuildContext context){ return StreamBuilder( stream: Firestore.instance.collection('markers').snapshots(), builder: (co

我有一个带有streambuilder的小部件,可以从firebase获取数据。我想在另一个小部件中的listview中显示此数据,但它不会显示在listview中。这是我的密码:

Widget _buildStream(BuildContext context){
return StreamBuilder(
          stream: Firestore.instance.collection('markers').snapshots(),
          builder: (context, snapshot) {
            if (!snapshot.hasData)
              return Center(
                child: CircularProgressIndicator(),
              );
            for (int i = 0; i < snapshot.data.documents.length; i++) {
               productMap.add(snapshot.data.documents[i]['name']);
               
            }
            return _buildGoogleMap(context);
}
);}
Widget\u buildStream(BuildContext上下文){
返回流生成器(
流:Firestore.instance.collection('markers').snapshots(),
生成器:(上下文,快照){
如果(!snapshot.hasData)
返回中心(
子对象:CircularProgressIndicator(),
);
对于(int i=0;i
以及具有listview的另一个小部件:

Widget _panel(ScrollController sc){
return MediaQuery.removePadding(
  context: context,
  removeTop: true,
  child: ListView(
    controller: sc,
    children: <Widget>[
      SizedBox(height: 12.0,),

      Row(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Container(
            width: 30,
            height: 5,
            decoration: BoxDecoration(
            color: Colors.grey[300],
              borderRadius: BorderRadius.all(Radius.circular(12.0))
            ),
          ),
        ],
      ),
      SizedBox(height: 18.0,),
      ListView.builder(
                          primary: false,
                          shrinkWrap: true,
                          physics: const NeverScrollableScrollPhysics(),
                          itemCount:
                              productMap == null ? 0 : productMap.length,
                          itemBuilder: (BuildContext context, int index) {
                            return new GestureDetector(
                              onTap: () {
                              },
                              child: Card(
                                  child: ListTile(
                                leading: CircleAvatar(
                                  backgroundImage:
                                      AssetImage('asset/green.png'),
                                ),
                                title: Text(productMap[index]),
                              )),
                            );
                          },
                        )
    ],
  )
);
}
Widget\u面板(ScrollController sc){
返回MediaQuery.removePadding(
上下文:上下文,
removeTop:没错,
子:ListView(
控制员:sc,,
儿童:[
尺寸箱(高度:12.0,),
划船(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
容器(
宽度:30,
身高:5,,
装饰:盒子装饰(
颜色:颜色。灰色[300],
边界半径:边界半径。全部(半径。圆形(12.0))
),
),
],
),
尺寸箱(高度:18.0,),
ListView.builder(
主要:错误,
收缩膜:对,
物理学:const NeverScrollableScrollPhysics(),
项目计数:
productMap==null?0:productMap.length,
itemBuilder:(构建上下文,int索引){
返回新的手势检测器(
onTap:(){
},
孩子:卡片(
孩子:ListTile(
领先:CircleAvatar(
背景图片:
AssetImage('asset/green.png'),
),
标题:文本(productMap[索引]),
)),
);
},
)
],
)
);
}

即使productMap包含数据,listview也是空的。我能做些什么来修复它?

将数据添加到列表后,调用setState()。这将使用更新的数据重建Ui。好的,我已经尝试过:setState((){productMap.add(snapshot.data.documents[I]['name']);});但是我会出错。一旦您将数据添加到列表中,请调用setState()。这将使用更新的数据重建Ui。好的,我已经尝试过:setState((){productMap.add(snapshot.data.documents[I]['name']);});但我会犯错误。