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

无法读取Firebase Firestore数据,应用卡在启动页求助

问题分析与解决方案

一、DynamiteModule警告处理

你遇到的com.google.android.gms.providerinstaller.dynamite相关警告,本质是Google Play Services版本不兼容或未更新导致的,会影响Firebase服务的正常初始化:

  • 设备/模拟器端:确保使用的模拟器带有Google Play服务镜像(如Google APIs Intel x86 Atom_64),并在设备内更新Google Play Services到最新版本;
  • 项目依赖端:在pubspec.yaml中确保cloud_firestore、firebase_auth等Firebase包为最新稳定版,执行flutter pub upgrade更新依赖。

二、代码逻辑错误修复

1. 第一个读取函数的逻辑反转问题

你原代码中if (userQuery.docs.isEmpty)的判断完全反了——只有当查询结果为空时才尝试赋值,这会导致永远无法获取有效数据。修正后的代码:

Future<void> readFirestoreData() async {
  try {
    QuerySnapshot userQuery = await FirebaseFirestore.instance
        .collection('users')
        .where('email', isEqualTo: user?.email)
        .get();

    if (userQuery.docs.isNotEmpty) { // 改为判断结果非空
      data.addAll(userQuery.docs);
      print(data);
      setState(() {
        age = data[0]['age'];
        weight = data[0]['weight'];
        height = data[0]['height'];
        gender = data[0]['gender'];
      });
    } else {
      print('未找到邮箱为${user?.email}的用户数据');
    }
  } catch (e) {
    print('读取Firestore数据出错: $e');
  }
}

2. MainScreen页面的核心问题修复

你的第二个实现存在三个致命问题:initState标记为async、获取数据后未更新UI、未监听Auth状态变化,导致页面卡住且数据不显示。修正后的完整代码:

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';

class MainScreen extends StatefulWidget {
  const MainScreen({Key? key}) : super(key: key);

  @override
  MainScreenState createState() => MainScreenState();
}

class MainScreenState extends State<MainScreen> {
  var age;
  var weight;
  var height;
  var gender;

  User? user;

  @override
  void initState() {
    super.initState();
    // 监听Auth状态变化,确保获取到已登录的用户实例
    FirebaseAuth.instance.authStateChanges().listen((currentUser) {
      setState(() {
        user = currentUser;
      });
      // 用户登录后再获取Firestore数据
      if (user != null) {
        getUserData();
      }
    });
  }

  Future getUserData() async {
    try {
      if (user?.email == null) {
        print('用户邮箱为空');
        return;
      }
      
      final querySnapshot = await FirebaseFirestore.instance
          .collection('users')
          .where("email", isEqualTo: user!.email)
          .get();

      if (querySnapshot.docs.isNotEmpty) {
        var userData = querySnapshot.docs[0].data();
        // 获取数据后必须调用setState更新UI
        setState(() {
          age = userData['age'];
          gender = userData['gender'];
          height = userData['height'];
          weight = userData['weight'];
        });
      } else {
        print('未找到邮箱为${user?.email}的用户数据');
      }
    } catch (e) {
      print('获取用户数据出错: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: user != null
            ? Column(
                mainAxisAlignment: MainAxisAlignment.center,
                crossAxisAlignment: CrossAxisAlignment.center,
                children: [
                  const Text('登录成功'),
                  Text('性别: ${gender ?? '加载中'}'),
                  Text('年龄: ${age ?? '加载中'}'),
                  Text('身高: ${height ?? '加载中'}'),
                  Text('体重: ${weight ?? '加载中'}'),
                  GestureDetector(
                    onTap: () async {
                      await FirebaseAuth.instance.signOut();
                      Navigator.pushNamedAndRemoveUntil(
                          context, '/loginscreen', (route) => false);
                    },
                    child: const Icon(
                      Icons.logout,
                      color: Colors.blue,
                    ),
                  )
                ],
              )
            : const Text('未登录'),
      ),
    );
  }
}

三、Firestore安全规则验证

确保你的Firestore安全规则允许已认证用户读取自己的数据,避免权限被拒绝:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId} {
      allow read, write: if request.auth != null && request.auth.email == resource.data.email;
    }
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 04:32:48