使用 Streambuilder 包装 CustomScrollView 和 Sliverlist 引发异常

问题描述

我正在尝试使用 Streambuilder 侦听来自 Firebase firestore 的实时文档,同时在 CustomScrollViewSliverList显示检索到的数据,但是当我这样做时,列表会中断并且屏幕保持空白。

我尝试了 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,)
        ],);
    },);
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...