Android Studio中Flutter Web集成Firebase出现未知错误的原因
Flutter 3.10升级后Firebase Auth未知错误问题(已自行恢复)
问题背景
项目最初基于Flutter 2.0集成Firebase,后续版本更新均无异常。升级至Flutter 3.10且闲置一个月后,输入任意邮箱(新/老用户均可,无论是否填写密码),Firebase均返回未知错误。
错误详情
[firebase_auth/unknown] An unknown error occurred: FirebaseError: Firebase: The password is invalid or the user does not have a password. (auth/wrong-password).
有趣的是,错误信息提及密码,但实际与密码无关。重置用户密码后,密码错误相关提示消失,但仍存在未知错误。
问题触发场景
- 仅在Android Studio中选择Chrome并点击绿色运行按钮时出现
- 使用以下命令启动Chrome时一切正常:
flutter run -d chrome --web-renderer canvaskit --release - 部署在Firebase Hosting并绑定域名的应用,通过域名访问可正常登录,无任何错误
已尝试的解决方法
- 清理Android Studio缓存
- 执行
flutter clean命令 - 格式化电脑
- 使用Firebase新的Flutter集成功能
- 在Google控制台生成新密钥并替换
- 咨询ChatGPT
当前状态
问题已自行消失,点击Android Studio绿色按钮运行也恢复正常,原因未知。
邮箱登录界面代码
import 'dart:math'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; import 'package:get/get_utils/src/get_utils/get_utils.dart'; import 'package:pineapplepay/view/login/email/EntrarComSenha.dart'; class EntrarComEmail extends StatefulWidget { const EntrarComEmail({ Key? key, }) : super(key: key); @override _EntrarComEmailState createState() => _EntrarComEmailState(); } class _EntrarComEmailState extends State<EntrarComEmail> { final TextEditingController _controllerEmail = TextEditingController(); String _mensagemErroEmail = ""; bool btnDesativado = false; @override void initState() { _controllerEmail.addListener(_verificarValoresControllerText); super.initState(); } @override Widget build(BuildContext context) { bool lightMode = MediaQuery.of(context).platformBrightness == Brightness.light; return WillPopScope( child: Scaffold( backgroundColor: lightMode ? Colors.white : Colors.white, appBar: AppBar( backgroundColor: Colors.transparent, iconTheme: const IconThemeData( color: Colors.black, ), shadowColor: Colors.transparent, elevation: 0.0, ), body: SingleChildScrollView( child: Padding( padding: const EdgeInsets.only(left: 40, right: 40), child: SizedBox( height: MediaQuery.of(context).size.height - (MediaQuery.of(context).size.height * 0.2), child: Column( children: [ const SizedBox( height: 55, ), Text( "Insira seu endereço de e-mail", textAlign: TextAlign.center, style: TextStyle( fontSize: 34, fontWeight: FontWeight.w500, color: lightMode ? const Color(0xff939094) : const Color(0xff939094), ), ), Expanded( child: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ ClipRRect( borderRadius: BorderRadius.only( topLeft: Radius.circular(4), topRight: Radius.circular(4), ), child: TextFormField( controller: _controllerEmail, keyboardType: TextInputType.emailAddress, cursorColor: lightMode ? const Color(0xffE91482) : const Color(0xffE91482), style: TextStyle( decorationColor: lightMode ? Colors.black : Colors.black, fontSize: 16, fontWeight: FontWeight.w400, fontFamily: "Unbutu", color: lightMode ? Colors.black : Colors.black, ), decoration: InputDecoration( prefixIcon: const Icon(Icons.email), border: const UnderlineInputBorder(), hintText: "fulano@gmail.com", hintStyle: TextStyle( fontSize: 16, fontWeight: FontWeight.w400, fontFamily: "Unbutu", color: lightMode ? Colors.black : Colors.black, ), label: Text("E-mail"), labelStyle: TextStyle( fontSize: 16, fontWeight: FontWeight.w400, fontFamily: "Unbutu", color: Colors.black, ), errorText: _mensagemErroEmail != "" ? _mensagemErroEmail : null, filled: true, ), ), ), ], ), ), ), SizedBox( width: double.infinity, child: TextButton( style: ButtonStyle( backgroundColor: MaterialStateProperty.all<Color>( lightMode ? const Color(0xffE91482) : const Color(0xffE91482), ), shape: MaterialStateProperty.all(RoundedRectangleBorder( borderRadius: BorderRadius.circular(0), )), padding: MaterialStateProperty.all<EdgeInsets>( const EdgeInsets.only( top: 20, bottom: 20, left: 50, right: 50, ), ), ), onPressed: () { if (!btnDesativado) { _validarCampos(); } }, child: Text( "Confirmar", style: TextStyle( fontSize: 24, color: lightMode ? Colors.white : Colors.white, fontWeight: FontWeight.w400, ), ), ), ), ], ), ), ), ), ), onWillPop: () async { Navigator.of(context).pop(); return true; }, ); } void _validarCampos() { if (_controllerEmail.text.isNotEmpty) { if (_controllerEmail.text.contains("@")) { if (_controllerEmail.text.length > 4) { if (GetUtils.isEmail(_controllerEmail.text)) { setState(() { btnDesativado = true; }); _logarUsuario(); } else { snackBar("Por favor insira um e-mail válido.", "Ok."); setState(() { _mensagemErroEmail = "Por favor insira um e-mail válido."; }); } } else { snackBar( "Você deve definir um e-mail maior do que 4 caracteres!", "Ok."); setState(() { _mensagemErroEmail = "Você deve definir um e-mail maior do que 4 caracteres!"; }); } } else { snackBar("Você esqueceu do @", "Ok."); setState(() { _mensagemErroEmail = "Você esqueceu do @"; }); } } else { snackBar("Você não pode definir um e-mail fantasma!", "Ok."); setState(() { _mensagemErroEmail = "Você não pode definir um e-mail fantasma!"; }); } } String generateRandomString(int len) { var r = Random(); const _chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz1234567890'; return List.generate(len, (index) => _chars[r.nextInt(_chars.length)]) .join(); } void _logarUsuario() async { String senha = generateRandomString(10); try { await FirebaseAuth.instance .signInWithEmailAndPassword( email: _controllerEmail.text, password: senha, ) .then((firebaseUser) async { FirebaseAuth.instance.signOut(); snackBar( "Ocorreu uma causalidade do destino em uma probabilidade tão improvável que este acontecimento deveria ser impossível. Portanto, você deve fazer o login novamente.", "Ok."); setState(() { _mensagemErroEmail = "Ocorreu uma causalidade do destino em uma probabilidade tão improvável que este acontecimento deveria ser impossível. Portanto, você deve fazer o login novamente."; }); }); } on FirebaseAuthException catch (e) { setState(() { btnDesativado = false; }); if (e.code == 'user-not-found') { snackBar("E-mail não cadastrado.", "Ok."); setState(() { _mensagemErroEmail = "E-mail não cadastrado."; }); } else { if (e.code == 'wrong-password') { _abrirTelaSenha(); } else { if (e.code == "too-many-requests") { snackBar( "E-mail bloqueado. Entre em contato com o suporte para restaurar seu e-mail", "Ok."); setState(() { _mensagemErroEmail = "E-mail bloqueado. Entre em contato com o suporte para restaurar seu e-mail"; }); } else { snackBar("Ocorreu um erro e o erro é: $e", "Ok."); setState(() { _mensagemErroEmail = "Ocorreu um erro e o erro é: $e"; }); } } } } catch (e) { snackBar("Ocorreu um erro e o erro é: $e", "Ok."); setState(() { btnDesativado = false; _mensagemErroEmail = "Ocorreu um erro e o erro é: $e"; }); } } void _abrirTelaSenha() { Navigator.push( context, MaterialPageRoute( builder: (context) => EntrarComSenha( key: widget.key, email: _controllerEmail.text, ), ), ); } void snackBar(String content, String label) { final snackBar = SnackBar( content: Text(content), action: SnackBarAction( label: label, onPressed: () { // Some code to undo the change. print("Tocou no SnackBarAction"); }, ), ); ScaffoldMessenger.of(context).showSnackBar(snackBar); } void _verificarValoresControllerText() { if (_controllerEmail.text.isNotEmpty) { if (_controllerEmail.text.contains("@")) { if (_controllerEmail.text.length > 4) { if (GetUtils.isEmail(_controllerEmail.text)) { setState(() { _mensagemErroEmail = ""; }); } else { setState(() { _mensagemErroEmail = "Por favor insira um e-mail válido."; }); } } else { setState(() { _mensagemErroEmail = "Você deve definir um e-mail maior do que 4 caracteres!"; }); } } else { setState(() { _mensagemErroEmail = "Você esqueceu do @"; }); } } else { setState(() { _mensagemErroEmail = "Você não pode definir um e-mail fantasma!"; }); } } }
内容的提问来源于stack exchange,提问作者Fábio Lucas
相关产品推荐
相关产品推荐

