Flutter安卓生产环境登录异常:正确密码登录无限卡顿求排查
排查Flutter Firebase登录正确密码卡顿问题的建议
问题背景
接手Flutter生产环境项目,仅做了新增页面、修改标签等非核心改动,未触碰登录、Firebase相关代码。但本地运行及发布App Bundle时均出现登录异常:输入错误密码会正常返回“邮箱或密码错误”提示,输入正确密码则无限卡顿,无明确错误日志,仅D/EGL_emulation(...): app_time_stats:...重复输出。已添加本地debug密钥的SHA1/SHA256至Firebase控制台,发布版本使用前开发者提供的jks文件。
排查与解决步骤
1. 验证密钥配置的完整性与正确性
- Debug版本:确认本地debug密钥的SHA1/SHA256已正确添加到Firebase控制台对应项目的「项目设置」→「应用」→「Android应用」→「SHA证书指纹」中,无重复或错误条目。
- Release版本:
- 检查jks文件存放路径是否与
android/app/build.gradle里signingConfigs的配置完全匹配,包括路径、密钥别名、密码,确保和前开发者提供的信息一致。 - 用命令
keytool -list -v -keystore your-keystore.jks重新生成该jks的SHA1/SHA256,核对Firebase控制台是否已添加该指纹——别依赖历史记录,自己重新验证。
- 检查jks文件存放路径是否与
- 修改指纹后,务必重新下载Firebase的
google-services.json文件替换android/app目录下的旧文件,确保文件里的client[0].oauth_client[].cert_hash和添加的指纹匹配。
2. 检查登录后的用户数据获取逻辑
从日志看,登录成功后会触发FetchUserEvent,卡顿大概率出在这个事件的处理流程里:
- 找到
FetchUserEvent对应的处理代码,排查是否存在无限循环、未正确处理的异步阻塞(比如没用到async/await导致Future一直没完成)、第三方服务超时(比如从Firestore拉取用户数据时没设超时时间)。 - 测试时可以临时注释掉
FetchUserEvent的执行逻辑,看登录后是否还卡顿,以此定位问题是否在用户数据拉取环节。
3. 补全异步代码的错误捕获
登录成功后的逻辑可能存在未捕获的异常,导致代码卡在异步步骤:
- 在
FirebaseAuth.instance.signInWithEmailAndPassword的回调或await后的代码里加完整的try/catch块,捕获所有异常并打印详细日志,包括异常类型和堆栈信息。 - 示例代码:
try { final userCredential = await FirebaseAuth.instance.signInWithEmailAndPassword( email: emailController.text, password: passwordController.text, ); print('登录成功,用户ID:${userCredential.user?.uid}'); // 触发FetchUserEvent的代码 await fetchUserData(userCredential.user!.uid); } catch (e, stackTrace) { print('登录后处理异常:$e'); print('堆栈信息:$stackTrace'); }
4. 确认Firebase初始化状态
检查Firebase是否在App启动时正确初始化,注意debug和release环境的差异:
- 确认
main.dart里Firebase.initializeApp()的调用在runApp()之前,且处理了初始化失败的情况。 - 可以在初始化时加日志,验证不同环境下的初始化结果:
void main() async { WidgetsFlutterBinding.ensureInitialized(); try { await Firebase.initializeApp(); print('Firebase初始化成功'); } catch (e) { print('Firebase初始化失败:$e'); } runApp(MyApp()); }
5. 排除设备/模拟器环境干扰
- 换物理设备测试,避免模拟器的EGL渲染统计日志(就是重复的
app_time_stats)干扰对核心问题的判断。 - 清除App缓存、卸载重装后再测试,避免旧数据或缓存导致的异常。
6. 核对Firebase权限配置
- 检查Firebase控制台「Authentication」→「登录方法」里的邮箱/密码登录是否处于启用状态。
- 确认「Firestore Database」或「Realtime Database」的安全规则允许已登录用户读取自己的数据,避免权限不足导致的静默失败(这种情况不会抛明显错误,但会阻塞数据获取)。
内容的提问来源于stack exchange,提问作者David Kiss
相关产品推荐
相关产品推荐

