我在使用 Firebase 身份验证登录我的应用时遇到问题。我之前让它可以工作,但我不知道我做了哪些更改最终破坏了代码。
下面是相关的类-main 用于控制加载哪些屏幕和 LoginScreen 来登录用户。创建新用户工作,创建新用户后我可以访问 MyHomePage()。由于到达并执行代码的 if(userSnapshot.hasData) ,main 中代码的 StreamBuilder 部分也有效。然而,屏幕只停留在 LoginScreen 上。也没有平台异常错误,控制台打印出来:
更新 问题是因为我错误地实现了 signOut()。我在 auth.FirebaseAuth.instance.signOut() 之前将应用程序屏幕导航到 LoginScreen。由于 StreamBuilder 用于侦听 authStateChanges,因此不需要导航到 LoginScreen。
D/FirebaseAuth(31169): Notifying id token listeners about user ( fK9nC6AFGmew1GLsXgj6FxK1zIg2 ). D/FirebaseAuth(31169): Notifying auth state listeners about user ( fK9nC6AFGmew1GLsXgj6FxK1zIg2 ).
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
SystemChrome.setPreferredOrientations(
[DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]);
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider(
create: (context) => MyUser(),
),
ChangeNotifierProvider(
create: (context) => Cities(),
),
],
child: MaterialApp(
debugShowCheckedModeBanner: false,
title: 'TestApp',
home: StreamBuilder(
stream: FirebaseAuth.instance.authStateChanges(),
builder: (ctx, userSnapshot) {
if (userSnapshot.hasData) {
return MyHomePage();
}
return LoginScreen();
},
),
),
);
}
}
class LoginScreen extends StatefulWidget {
@override
_LoginScreenState createState() => _LoginScreenState();
}
class _LoginScreenState extends State<LoginScreen> {
final _auth = auth.FirebaseAuth.instance;
var message = '';
void _login(User myUser, BuildContext ctx) async {
try {
await _auth.signInWithEmailAndPassword(
email: myUser.userEmail,
password: myUser.userPassword,
);
} on PlatformException catch (err) {
if (err.message != null) {
message = err.message;
}
} catch (err) {
print(err);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(body: InputForm(_login));
}
}
答案 0 :(得分:0)
登录似乎没有错误
只需像这样在主页中将 LoginScreen 添加为默认值
child: MaterialApp(
debugShowCheckedModeBanner: false,
title: 'TestApp',
home: LoginScreen(),
),
然后在你的逻辑中,在你调用 signInWithEmailAndPassword
firebase 方法之后,使用像这样的 Navigator 方法
Navigator.push(
context,
MaterialPageRoute(builder: (context) => MyHomePage()),
);
有关详细信息,请阅读此Flutter navigation
答案 1 :(得分:0)
您的代码似乎工作正常,只是当您在下面的代码块中捕获 PlatformExceptions 时,您没有做任何事情(除了将值分配给这里没有做任何事情的消息变量)。
> on PlatformException catch (err) {
if (err.message != null) {
message = err.message;
}
}
因此,即使您有 PlatformException
,您也不会在控制台中看到任何内容,这意味着登录可能会以静默方式失败。
解决方案:
try {
await _auth.signInWithEmailAndPassword(
email: myUser.userEmail,
password: myUser.userPassword,
);
} catch (err) {
print(err);
}
on PlatformException catch (err) {
print(err);
}