无法使用 Firebase 登录

时间:2021-07-07 00:09:08

标签: firebase flutter dart firebase-authentication

我在使用 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));
  }
}


2 个答案:

答案 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,您也不会在控制台中看到任何内容,这意味着登录可能会以静默方式失败。

解决方案:

  • 如果您希望最终的 catch 块处理所有异常,可以直接使用 catch 块。
  try {
    await _auth.signInWithEmailAndPassword(
      email: myUser.userEmail,
      password: myUser.userPassword,
    );
  } catch (err) {
    print(err);
  }
  • 如果要打印 PlatformException,可以像在 catch 块中那样添加打印语句:
     on PlatformException catch (err) {
       print(err);
     }
相关问题