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);
}
}
我试着按照这里的解决方案,
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);
}
}