问题描述
我正在尝试使用 Streambuilder
侦听来自 Firebase firestore 的实时文档,同时在 CustomScrollView
和 SliverList
中显示检索到的数据,但是当我这样做时,列表会中断并且屏幕保持空白。
我尝试了 FutureBuilder
并且它有效,但不能满足我的要求。
这是我为流构建器编写的代码:
Widget sliverList() {
return CustomScrollView(
slivers: <Widget>[
SliverAppBar(
backgroundColor: Colors.transparent,expandedHeight: 220.0,flexibleSpace: FlexibleSpaceBar(
collapseMode: CollapseMode.parallax,background: Column(
children: [Daily(),AddPost()],),StreamBuilder<QuerySnapshot>(
stream: FeedServices.listenToFeedinStream(),builder: (context,AsyncSnapshot<QuerySnapshot> snapshot) {
return SliverFixedExtentList(
itemExtent: 500,delegate: SliverChildBuilderDelegate(
(BuildContext context,int index) {
if (snapshot.hasData) {
Post post = Post.fromMap(snapshot.data.docs[index].data());
return Column(
children: [
FeedItem(
thread: post,seperator()
],);
} else if (!snapshot.hasData) {
return Text('no data');
} else if (snapshot.hasError) {
return Text('has err');
} else {
return Text('not specified');
}
},childCount: snapshot.data.docs.length,);
})
],);
}
异常捕获:
Flutter: The following NoSuchMethodError was thrown building StreamBuilder<QuerySnapshot>(dirty,state:
Flutter: _StreamBuilderBaseState<QuerySnapshot,AsyncSnapshot<QuerySnapshot>>#da6d3):
Flutter: The getter 'docs' was called on null.
Flutter: Receiver: null
Flutter: Tried calling: docs
解决方法
您应该只将 Sliver 小部件传递给 slivers
列表。
StreamBuilder
不是 Sliver,因此您可以用 CustomScrollView
包裹整个 StreamBuilder
。
Widget sliverList() {
return StreamBuilder<QuerySnapshot>(
stream: feedServices.listenToFeedinStream(),builder: (context,snapshot) {
return CustomScrollView(
slivers: <Widget>[
SliverAppBar(
backgroundColor: Colors.transparent,expandedHeight: 220.0,flexibleSpace: FlexibleSpaceBar(
collapseMode: CollapseMode.parallax,background: Column(
children: [Daily(),AddPost()],),SliverFixedExtentList(
itemExtent: 500,delegate: SliverChildBuilderDelegate(
(BuildContext context,int index) {
if (snapshot.hasData) {
Post post = Post.fromMap(snapshot.data.docs[index].data());
return Column(
children: [
FeedItem(
thread: post,seperator()
],);
} else if (!snapshot.hasData) {
return Text('no data');
} else if (snapshot.hasError) {
return Text('has err');
} else {
return Text('not specified');
}
},childCount: snapshot.data.docs.length,)
],);
},);
}