【问题标题】:Firestore changes are not synced with stream builderFirestore 更改未与流生成器同步
【发布时间】:2020-11-01 01:59:20
【问题描述】:

当我在控制台或应用程序中更新数据库时,更改不会在应用程序中同步。我认为这是因为 orderBy 和索引设置,但评论它们并没有帮助。我的代码有什么问题?如何设置自动同步?

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      drawer: DrawerMenu(),
      appBar: AppBar(
        title: Text('Заявки'),
      ),
      body: StreamBuilder<QuerySnapshot>(
        stream: Firestore.instance
            .collection('orders')
            .where('companyId', isEqualTo: globals.companyId)
            // .orderBy('dateAdded', descending: true)
            // .orderBy('statusId')
            .snapshots(),
        builder: (context, snapshot) {
          if (snapshot.hasError) {
            return Text('Error: ${snapshot.error}');
          }
          switch (snapshot.connectionState) {
            case ConnectionState.waiting:
              return LoadingScreen();
            default:
              return ListView.builder(
                  itemCount: snapshot.data.documents.length,
                  itemBuilder: (context, index) => GestureDetector(
                      onTap: () => Navigator.push(
                          context,
                          MaterialPageRoute(
                            builder: (context) => Items(
                              order: snapshot.data.documents[index],
                            ),
                          )),
                      child: OrderCard(
                        order: snapshot.data.documents[index],
                      )));
          }
        },
      ),
    );
  }

【问题讨论】:

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


    【解决方案1】:

    这是因为您只是将快照作为流获取一次,但要在控制台或应用程序中进行修改时获取实际更改,您需要订阅流。您需要 .listen 数据流,以便在发生变化时得到通知。

    此外,您可能希望更轻松地分离 firebase 的逻辑。

    例如:

    创建一个流控制器:

    final StreamController<DataType> _streamController = StreamController<DataType>();
    

    监听 firebase 数据并将其添加到流中:

    Firestore.instance
            .collection('orders')
            .where('companyId', isEqualTo: globals.companyId)
            .snapshots().listen((DocumentSnapshot snapShot){
              _streamController.add(snapShot.documents);
            });
    

    现在您可以从流控制器收听流:

    _streamController.stream;
    

    【讨论】:

    • 如何创建一个空安全的流控制器?
    • Null Safety 改变了很多我们习惯喜欢的东西。 :(
    【解决方案2】:

    事实证明,当查询包含 .where().orderBy 等时,需要在 firestore 控制台中添加自定义索引。

    【讨论】:

      猜你喜欢
      • 2020-09-14
      • 1970-01-01
      • 1970-01-01
      • 2020-04-16
      • 1970-01-01
      • 1970-01-01
      • 2021-01-03
      • 2023-01-18
      • 2020-09-13
      相关资源
      最近更新 更多