为什么 Android Studio 上的 Flutter Web 中的 Firebase 出现未知错误?

问题描述 投票:0回答:1

当我第一次创建项目并将 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 firebase android-studio authentication
1个回答
0
投票

这似乎是 Flutter Web 上 Firebase 身份验证的问题,当我收到此错误代码并且使用 error.code 时,Firebase“电子邮件已在使用”,它显示未知,但是当我在发布模式下运行时,会出现错误。代码显示“电子邮件已在使用中”

© www.soinside.com 2019 - 2024. All rights reserved.