Flutter:在不注销的情况下创建帐户会导致错误

Flutter: Creating an account without logging out causes error

我试着按照这里的解决方案,

Future<void> register(BuildContext context) async {
    FirebaseApp app = await Firebase.initializeApp(
        name: 'secondary', options: Firebase.app().options);
    try {
      UserCredential userCredential = await FirebaseAuth.instanceFor(app: app)
          .createUserWithEmailAndPassword(
              email: email.text, password: password.text);
      Navigator.push(
        context,
        MaterialPageRoute(builder: (context) => createSetupPage()),
      );
    } on FirebaseAuthException catch (e) {
      if (e.code == 'weak-password') {
        setState(() {
          ScaffoldMessenger.of(context).showSnackBar(SnackBar(
            content: Text('Weak Password'),
          ));
        });
      } else if (e.code == 'email-already-in-use') {
        ScaffoldMessenger.of(context).showSnackBar(SnackBar(
          content: Text('Email Already In Use'),
        ));
      }
    } catch (e) {
      print(e);
    }
  }

当我创建一个帐户时,它工作一次然后给我这个错误,当我尝试使用此代码创建另一个同名帐户时,它在控制台中给我这个错误

E/flutter ( 1191): [ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: [core/duplicate-app] A Firebase App named "secondary" already exists

如何解决此问题,以便我可以继续创建多个帐户而不会从一个帐户注销?看来我在 Firebase.initialize 应用程序部分需要一个新名称。

您的 Firebase 应用程序实例应在每次应用程序启动时仅初始化一次。

然后您应该移动初始化块:

FirebaseApp app = await Firebase.initializeApp(
    name: 'secondary', options: Firebase.app().options);

在方法调用之外并在启动时初始化:

void main() async {
    FirebaseApp app = await Firebase.initializeApp(
        name: 'secondary', options: Firebase.app().options);
    //...
}

然后您可以在需要时将 FirebaseApp 实例作为参数传递给被调用方:

Future<void> register(FirebaseApp app, BuildContext context) async {
    try {
      UserCredential userCredential = await FirebaseAuth.instanceFor(app: app)
          .createUserWithEmailAndPassword(
              email: email.text, password: password.text);
      Navigator.push(
        context,
        MaterialPageRoute(builder: (context) => createSetupPage()),
      );
    } on FirebaseAuthException catch (e) {
      if (e.code == 'weak-password') {
        setState(() {
          ScaffoldMessenger.of(context).showSnackBar(SnackBar(
            content: Text('Weak Password'),
          ));
        });
      } else if (e.code == 'email-already-in-use') {
        ScaffoldMessenger.of(context).showSnackBar(SnackBar(
          content: Text('Email Already In Use'),
        ));
      }
    } catch (e) {
      print(e);
    }
}

也就是说,您可以完全省略传递 FirabseApp 实例,因为 firebase_auth 库将在引导时保留默认应用程序实例。

在您的应用程序启动步骤调用 await Firebase.initializeApp(); 后,您可以简单地访问引用默认应用程序的 FirebaseAuth.instance

Future<void> register(BuildContext context) async {
    try {
      UserCredential userCredential = await FirebaseAuth.instance.createUserWithEmailAndPassword(
              email: email.text, password: password.text);
      Navigator.push(
        context,
        MaterialPageRoute(builder: (context) => createSetupPage()),
      );
    } on FirebaseAuthException catch (e) {
      if (e.code == 'weak-password') {
        setState(() {
          ScaffoldMessenger.of(context).showSnackBar(SnackBar(
            content: Text('Weak Password'),
          ));
        });
      } else if (e.code == 'email-already-in-use') {
        ScaffoldMessenger.of(context).showSnackBar(SnackBar(
          content: Text('Email Already In Use'),
        ));
      }
    } catch (e) {
      print(e);
    }
}