当我第一次创建项目并将 Flutter 与 Firebase 集成时,Flutter 还是 2.0 版本。 Flutter 正在更新,我从来没有遇到任何问题。现在,最近,随着 Flutter 3.10 更新,在花了 1 个多月没有接触该项目之后,当我尝试插入电子邮件时,任何电子邮件,即使是新用户或老用户,有或没有密码,firebase 总是给我同样的错误消息:未知错误。
这里我有这个错误的更多细节:
[firebase_auth/unknow] 发生未知错误:FirebaseError:Firebase:密码无效或用户没有密码。 (身份验证/密码错误)。
有趣的是,错误谈到了密码,但实际上,就像我说的,它与密码无关。当我重置用户密码时,有关密码错误的部分消息消失,但错误消息的其余部分仍然存在。
仅当我在 Android Studio 中选择 Chrome 并单击 Android Studio 中的绿色“播放”按钮时,才会出现此问题。当我最后使用
--release
参数运行它时:
flutter run -d chrome --web-renderer canvaskit --release
使用上述命令打开Chrome,一切正常。我的应用程序也托管在 Firebase Hosting 上,并与我的域连接。并且,通过连接到 Firebase Hosting 的域访问应用程序,我也可以正常进入应用程序,甚至没有错误消息。
所以我的问题只是与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: "[email protected]",
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!";
});
}
}
}
Edit:
Ok, so, the problem is gone. I dont know why, I have no idea. But, I tried to run with the green button on Android Studio and everything works fine. So I will mark this as done.
我已经清理了 Android Studio 缓存,我已经运行了 flutter clean 命令,我已经格式化了计算机。 Firebase 现在支持 Flutter 中的应用集成。正如我之前所解释的,当我在 Flutter 中创建应用程序时,此选项不存在。因此,为了解决我的问题,我尝试使用这个新的集成,我正确地遵循了步骤,但仍然存在完全相同的错误。另外,我已经在 Google 控制台中生成了新密钥,并且已经在我的项目中替换了新密钥。我什至使用 ChatGPT 给我提供想法,但即使他也无法理解发生了什么。
这似乎是 Flutter Web 上 Firebase 身份验证的问题,当我收到此错误代码并且使用 error.code 时,Firebase“电子邮件已在使用”,它显示未知,但是当我在发布模式下运行时,会出现错误。代码显示“电子邮件已在使用中”