无法读取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
相关产品推荐
相关产品推荐

