我是使用Flutter 1.0和Dart 2.0的新手,对于Futures中的错误处理,我有些不了解(已经读过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返回错误:“给出的字符串为空或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服务代码中的Platform Exception是同步的。但是我也认为将其包装在Future.sync()中可以解决此问题。我猜我可以将其包装在try / catch中,然后等待auth.signIn ...调用,但是我认为Futures API可以正常工作,并允许异常冒泡到我想处理的.catchError上。它。