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

Flutter应用读取Cloud Firestore数据时在模拟器加载页卡住

Flutter Firestore读取数据后页面一直显示加载圈的解决方案

代码核心错误

你的MyHomePage组件中,StreamBuilder的逻辑存在关键问题:当snapshot.connectionState == ConnectionState.active(数据已就绪)时,你仅获取了QuerySnapshot对象,但没有返回渲染数据的Widget,代码最后无条件返回CircularProgressIndicator,导致页面始终停留在加载状态。

修复后的代码

将MyHomePage的相关代码修改为以下内容(重点调整StreamBuilder部分):

class _MyHomePageState extends State<MyHomePage> {
  CollectionReference _referenceShoppingList = FirebaseFirestore.instance.collection('shopping_list');
  late Stream<QuerySnapshot> _streamShoppingItems;

  @override
  void initState() {
    super.initState();
    _streamShoppingItems = _referenceShoppingList.snapshots();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
        actions: [
          IconButton(
            onPressed: () async {
              await GoogleSignIn().signOut();
              FirebaseAuth.instance.signOut();
            },
            icon: Icon(Icons.power_settings_new),
          )
        ],
      ),
      body: StreamBuilder<QuerySnapshot>(
        stream: _streamShoppingItems,
        builder: (BuildContext context, AsyncSnapshot snapshot) {
          // 处理错误状态
          if (snapshot.hasError) {
            return Center(child: Text('加载出错: ${snapshot.error}'));
          }

          // 处理加载中状态
          if (snapshot.connectionState == ConnectionState.waiting) {
            return Center(child: CircularProgressIndicator());
          }

          // 数据就绪,渲染列表
          QuerySnapshot querySnapshot = snapshot.data;
          List<QueryDocumentSnapshot> docs = querySnapshot.docs;

          // 根据你的文档结构转换数据,这里假设文档存储的是字符串字段(比如字段名为'item')
          List<String> shoppingItems = docs.map((doc) => doc.get('item').toString()).toList();

          return ListView.builder(
            itemCount: shoppingItems.length,
            itemBuilder: (context, index) {
              return ListTile(title: Text(shoppingItems[index]));
            },
          );
        },
      ),
    );
  }
}

额外排查要点

  • Firestore安全规则:确认规则允许已登录用户读取shopping_list集合,示例规则如下:
    rules_version = '2';
    service cloud.firestore {
      match /databases/{database}/documents {
        match /shopping_list/{doc} {
          allow read, write: if request.auth != null;
        }
      }
    }
    
  • 字段名匹配:代码中读取的字段名要和Firestore文档中的字段名完全一致(大小写敏感)。
  • 网络连接:确保模拟器/真机能正常访问Firebase服务,可尝试重启设备或切换网络。

内容的提问来源于stack exchange,提问作者Seçkin Kızılkaya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 00:42:38