flutter - 在 PageView 中显示流中的单个项目

标签 flutter google-cloud-firestore

我有以下小部件,它使用 PageView 在单独的页面中显示每本书。

class Books extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _BooksState();
  }
}

class _BooksState extends State<Books> {
  PageController controller = PageController();
  String title = 'Title of the AppBar';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(title),
      ),
      body: PageView.builder(
        controller: controller,
        scrollDirection: Axis.horizontal,
        itemBuilder: (context, position) {
          return Center(position.toString());
          // return BooksStream();
        },
        onPageChanged: (x) {
          setState(() {
            title = '$x';
          });
        },
      ),
    );
  }
}

我还有 FlutterFire 文档中的这个示例小部件,用于从 firestore 集合中获取所有文档:

class BooksStream extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StreamBuilder<QuerySnapshot>(
      stream: Firestore.instance.collection('Books').snapshots(),
      builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
        if (snapshot.hasError) return new Text('Error: ${snapshot.error}');
        switch (snapshot.connectionState) {
          case ConnectionState.waiting:
            return new Text('Loading...');
          default:
            return new ListView(
              children:
                  snapshot.data.documents.map((DocumentSnapshot document) {
                return new ListTile(
                  title: new Text(document['title']),
                  subtitle: new Text(document['author']),
                );
              }).toList(),
            );
        }
      },
    );
  }
}

在 PageView.builder 中,当我返回 BooksStream() 时,它会在每一页上显示所有书籍,这是完全正常的。

但是我如何使用 StreamBuilder 在 PageView 的单独页面上显示每本书?

谢谢。

最佳答案

您可以像这样在 StreamBuilder builder 字段中返回 PageView.builder:

class BooksStream extends StatelessWidget {
  PageController controller = PageController();

  @override
  Widget build(BuildContext context) {
    return StreamBuilder<QuerySnapshot>(
      stream: Firestore.instance.collection('Books').snapshots(),
      builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
        if (snapshot.hasError) return new Text('Error: ${snapshot.error}');
        switch (snapshot.connectionState) {
          case ConnectionState.waiting:
            return new Text('Loading...');
          default:
            return PageView.builder( // Changes begin here
              controller: controller,
              scrollDirection: Axis.horizontal,
              itemCount: snapshot.data.documents.length,
              itemBuilder: (context, position) {
                final document = snapshot.data.documents[position];

                return ListTile(
                  title: new Text(document['title']),
                  subtitle: new Text(document['author']));
              }
            );
        }
      },
    );
  }
}

然后就在 Scaffoldbody 中,您可以实例化 BooksStream

关于flutter - 在 PageView 中显示流中的单个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54485485/

相关文章:

firebase - firestore 中 onSnapshot 的性能成本是多少?

firebase - 本地写入 Firebase RTDB 或带有附加监听器的 Firestore 是否需要读取操作?

javascript 映射到 Firestore -> 错误 : Value for argument "data" is not a valid Firestore document. 输入不是纯 JavaScript 对象

android-studio - 如何在Flutter中从应用名称中删除下划线

android - flutter :为什么我无法获得电池电量?

android - Flutter 无法下载 kotlin-compiler-embeddedable-1.5.21.jar (org.jetbrains.kotlin :kotlin-compiler-embeddable-1. 5.21.jar

firebase - 隔离和管理由登录用户完成的集合CRUD-Firebase和Flutter

ios - 在 Cloud Firebase 的 Swift SDK 上按多个值(逻辑 "or")查询

javascript - 在 Firestore 中,如何在不为每个键创建索引的情况下执行涉及映射中键的复合查询?

flutter - Flutter Bloc未重建状态