首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Flutter: FireBase抛出的PlatformException不会被捕获

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

Stack Overflow用户
提问于 2020-03-23 22:27:15
回答 2查看 1K关注 0票数 0

我有一个使用firebase_auth登录Firebase的函数,然而,每当抛出异常时,它都不会被捕获,仍然会出现在Android Studio控制台中,catch块中的print语句也不会运行。

我该如何解决这个问题?

代码语言:javascript
运行
复制
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());
      }
    }
  }
EN

回答 2

Stack Overflow用户

发布于 2020-03-23 22:35:12

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

代码语言:javascript
运行
复制
 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

票数 2
EN

Stack Overflow用户

发布于 2021-01-05 17:47:05

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

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

代码语言:javascript
运行
复制
  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时出现的错误:

代码语言:javascript
运行
复制
  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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60815495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档