我不了解期货中的错误处理(已阅读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我想要处理的地方它 .