我不了解期货中的错误处理(已阅读futures error handling) .

此代码不会捕获并从堆栈内部抛出异常:

_userRepository.loginWithEmailAndPassword(email, password)
.then((user) {
  print(user.id);
  print(user.toString());
}).catchError((err) {
  print(err.toString());
});

在_userRepository中:

@override
  Future<UserEntity> loginWithEmailAndPassword(String email, String password) {
    return new Future(() {
      return auth.signInWithEmailAndPassword(email: email, password: password)
      .then((user) {
        return UserEntity(
          user.uid,
          user.displayName,
          user.email,
          emailVerified: user.isEmailVerified,
          isAnonymous: user.isAnonymous,
          phoneNumber: user.phoneNumber,
          photoUrl: user.photoUrl,
          created: user.metadata.creationTimestamp,
          lastSignIn: user.metadata.lastSignInTimestamp
        );
      });
   });
  }

auth 是FirebaseAuth包 . signInWithEmailAndPassword 返回 Future<FirebaseUser> . 那个电话工作正常 . 我的测试中密码为空,FirebaseAuth返回错误dart / flutter:"Given String is empty or null" . Flutter在此行抛出message_codecs.dart中的错误:

throw PlatformException(code: errorCode, message: errorMessage, details: errorDetails);

所有这些都按预期工作,但我不明白为什么.catchError没有捕获异常 . loginWithEmailAndPassword 将代码块包装在 new Future() 中 . 我也尝试了 new Future.sync() 并尝试不包装代码块而只是返回 return auth.signInWithEmailAndPassword.then(...); .

从我的阅读,我猜测问题是Flutter服务代码中的平台异常是同步的 . 但我也认为将它包装在Future.sync()中可以解决这个问题 . 我猜我可以将它包装在try / catch中并等待auth.signIn ...调用,但我认为Futures API会起作用并允许异常冒泡到.catchError我想要处理的地方它 .