Flutter:FireBase抛出的PlatformException不会被捕获

时间:2020-03-23 14:27:14

标签: firebase flutter firebase-authentication

我有一个用于使用firebase_auth登录到Firebase的函数,但是,每当引发异常时,它都不会被捕获并仍然出现在Android Studio控制台中,也不会运行catch块中的打印语句

我该如何解决?

signIn({String email, String password}) {
    print('listened');
    try {
      FirebaseAuth.instance.signInWithEmailAndPassword(
          email: email, password: password);
    }
    on PlatformException catch (signUpError) {
      print(signUpError.code);
      if (signUpError.code == 'ERROR_WEAK_PASSWORD') {

        print('Weak Password');

      }else if(signUpError.code=='ERROR_USER_NOT_FOUND'){
        print('Invalid Username');
      }

      else{
        print(signUpError.toString());
      }
    }
  }

2 个答案:

答案 0 :(得分:2)

signInWithEmailAndPassword返回一个Future<AuthResult>(它是异步的),因此在调用异步方法时,您需要使用catchError方法来捕获错误:

 FirebaseAuth.instance.signInWithEmailAndPassword(email: email, password: password).then((result) {
    print(result);
})
.catchError((error) {
    print("Something went wrong: ${error.message}");
  });

检查以下内容:

https://api.dart.dev/stable/2.3.0/dart-async/Future/catchError.html

https://medium.com/firebase-tips-tricks/how-to-use-firebase-authentication-in-flutter-50e8b81cb29f

答案 1 :(得分:0)

如果 Firebase 调用在 try catch 函数内并且在调用 Firebase 时使用 async 语句,则 await 块将起作用。

例如,在以下代码中,获取令牌的错误将被 on PlatformException catch (... 块捕获,但将令牌写入 FB RTDB 的错误不会是:

  Future<void> _saveDeviceToken() async {
    try {
      final _currentUser = _firebaseAuth.currentUser;
      final fcmToken = await _firebaseMessaging.getToken();
      if (fcmToken != null) {
        // Save the token to Firebase - NO AWAIT STATEMENT
        globals.firebaseDatabase
            .reference()
            .child("pushTokens")
            .child("${_currentUser.uid}")
            .set({"token": fcmToken});
      }
    } on PlatformException catch (error, stackTrace) {
      print("error: $error");
    }
  }

而添加 await 语句(如以下代码所示)也会在写入 FB RTDB 时捕获错误:

  Future<void> _saveDeviceToken() async {
    try {
      final _currentUser = _firebaseAuth.currentUser;
      final fcmToken = await _firebaseMessaging.getToken();
      if (fcmToken != null) {
        // Save the token to Firebase - AWAIT STATEMENT ADDED
        await globals.firebaseDatabase
            .reference()
            .child("pushTokens")
            .child("${_currentUser.uid}")
            .set({"token": fcmToken});
      }
    } on PlatformException catch (error, stackTrace) {
      print("error: $error");
    }
  }

如果您不想或不能使用 await,那么根据 Peter 的回答,解决方案是使用 catchError 语句而不是 try catch