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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 23:47:05