Flutter: PlatformException thrown by FireBase won't get caught

本秂侑毒 提交于 2021-01-29 13:52:01

问题


I have a function that is used to sign in to Firebase using firebase_auth, however, whenever an exception is thrown it isn't getting caught and still appears in the Android Studio console nor do the print statements in the catch block ever run.

How do I fix this?

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());
      }
    }
  }

回答1:


signInWithEmailAndPassword returns a Future<AuthResult> (it is asynchronous), therefore you need to use the catchError method to catch the error when calling an asynchronous method:

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

Check the following:

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




回答2:


The try catch blocks will work if the Firebase call is within an async function and the await statement is used when calling Firebase.

For example, in the following code an error getting the token will be trapped by the on PlatformException catch (... block but an error writing the token to FB RTDB won't be:

  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");
    }
  }

whereas adding the await statement, as in the following code, will trap errors in writing to FB RTDB as well:

  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");
    }
  }

If you don't want to or can't use await then, as per Peter's answer, the solution is to use the catchError statement instead of try catch.



来源:https://stackoverflow.com/questions/60815495/flutter-platformexception-thrown-by-firebase-wont-get-caught

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!