嵌套两个导致错误状态错误的流构建器
Nesting two stream builders causing bad state error
我正在从两个不同的 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;
}
您不应在 StreamBuilder
中创建新的 Stream
。当你这样做时:
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
并在 initState()
上初始化 Stream
,将其作为 class 变量传递给 StreamBuilder
。嵌套的 StreamBuilder
也可以转换为 StatefulWidget
并就地创建,但初始化方式相同。请注意,您可能需要 Key
才能在 ListView
.
上正确显示
此外,如果您想将单一订阅 Stream
转换为广播 Stream
,您只需调用 asBroadcastStream
即可进行转换。
我正在从两个不同的 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;
}
您不应在 StreamBuilder
中创建新的 Stream
。当你这样做时:
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
并在 initState()
上初始化 Stream
,将其作为 class 变量传递给 StreamBuilder
。嵌套的 StreamBuilder
也可以转换为 StatefulWidget
并就地创建,但初始化方式相同。请注意,您可能需要 Key
才能在 ListView
.
此外,如果您想将单一订阅 Stream
转换为广播 Stream
,您只需调用 asBroadcastStream
即可进行转换。