嵌套两个流生成器会导致状态错误

时间:2020-06-22 15:43:03

标签: firebase flutter google-cloud-firestore stream-builder

我正在从两个不同的firestore集合中获取数据,这是我的代码

 StreamBuilder(
           stream: Firestore.instance.collection('items').snapshots(),
           builder: (BuildContext context, snapshot){

             if(snapshot.connectionState == ConnectionState.waiting){
               return CupertinoActivityIndicator();
             }
             if(snapshot.data != null){
               return ListView.builder(
                 itemCount: snapshot.data.documents.length,
                 itemBuilder: (context,index){
                   return Column(
                     children: <Widget>[

                       Text(snapshot.data.documents[index]['name']),
                       Text(snapshot.data.documents[index]['color']),
                       Text(snapshot.data.documents[index]['lifetime']),

                       Container(
                         child: StreamBuilder(
                           stream: Firestore.instance.collection('users')
                            .document(userid).collection('Quantity')
                            .document(snapshot.data.documents[index]['id']).snapshots(),
                           builder: (BuildContext context, snap){

                             if(snapshot.connectionState == ConnectionState.waiting){
                              return CupertinoActivityIndicator();
                            }
                            if(snap.data != null){
                              return Container(
                              child:  Text(snap.data.documents.length)
                              );
                            }
                           },
                         ),
                       )

                     ],
                   );
                 });
             }
           },
         )

这给了我错误,但是当我在streambuilder中使用futurebuilder时,一切正常,我也使用了流广播,但它也给了我同样的错误。 这是我用于广播流的代码

  StreamController _controller = StreamController.broadcast();
        Stream getItems() async*{
          Firestore.instance.collection('items').snapshots().listen((data){
            _controller.add(data);
          })
          yield* _controller.stream;
        }

This is the error I am getting

1 个答案:

答案 0 :(得分:2)

您不应在Stream内创建新的StreamBuilder。当您这样做时:

StreamBuilder(
  stream: Firestore.instance.collection('items').snapshots(),

StreamBuilder(
  stream: Firestore.instance.collection('users')
    .document(userid).collection('Quantity')
    .document(snapshot.data.documents[index]['id']).snapshots(),

每次创建build()函数时都会创建一个新的StreamBuilder,因此会调用Firestore.instance.collection()...snapshots(),每次都返回一个新的Stream

您应该将窗口小部件转换为StatefulWidget,并在Stream上初始化initState(),并将其作为类变量传递给StreamBuilder。嵌套的StreamBuilder也可以转换为StatefulWidget并就地创建,但是可以用相同的方式初始化。请注意,您可能需要Key才能正确显示在ListView上。

此外,如果您要将单个订阅Stream转换为广播Stream,则只需调用asBroadcastStream即可将其转换。