You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firestore新增数据无法实时展示,需刷新页面才可见

解决Firestore数据无法实时更新的问题

你的问题核心在于使用了Firestore的get()方法单次获取数据,而非实时监听数据变化。以下是具体修改方案:

1. 替换列表外层的FutureBuilder为StreamBuilder

直接监听gameinfo集合的实时快照,无需单独的getGamesId方法:

StreamBuilder<QuerySnapshot>(
  stream: FirebaseFirestore.instance.collection('gameinfo').snapshots(),
  builder: (context, snapshot) {
    if (!snapshot.hasData) {
      return const Center(child: CircularProgressIndicator());
    }
    final docs = snapshot.data!.docs;
    return ListView.builder(
      itemCount: docs.length,
      itemBuilder: (context, index) {
        final docId = docs[index].id;
        return Container(
          height: 300,
          child: GetGamesInfo(documentId: docId),
        );
      },
    );
  },
)

2. 修改GetGamesInfo组件为实时监听单个文档

将原来的FutureBuilder替换为StreamBuilder,监听单个文档的变化:

final String documentId;

const GetGamesInfo({required this.documentId});

@override
Widget build(BuildContext context) {
  return StreamBuilder<DocumentSnapshot>(
    stream: FirebaseFirestore.instance.collection('gameinfo').doc(documentId).snapshots(),
    builder: (context, snapshot) {
      if (!snapshot.hasData) {
        return const Text('');
      }
      Map<String, dynamic> data = snapshot.data!.data() as Map<String, dynamic>;
      return Center(child: Text('${data['selectedGame']}'));
    },
  );
}

原理说明

  • get()方法仅在调用时执行一次数据请求,后续集合/文档的变化不会触发UI更新;
  • snapshots()方法会返回一个持续的数据流,当Firestore中的数据发生新增、修改或删除时,会自动推送最新的快照,StreamBuilder会根据新快照重建UI,实现实时更新效果。

内容的提问来源于stack exchange,提问作者KKot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 04:28:11