我一直在努力寻找解决方案,由于我的知识面有限,我似乎在以错误的方式做某事,所以这是问题的根源:
public void RegisterNewUser()
{
FetchRegisterInputValues();
if (CheckRegisterDataIntegrity())
{
_auth.CreateUserWithEmailAndPasswordAsync(_email, _password).ContinueWith(task => {
if (task.IsCanceled) {
Debug.LogError("CreateUserWithEmailAndPasswordAsync was canceled.");
return;
}
if (task.IsFaulted)
{
HandleRegistrationErrors(task.Exception);
return;
}
// Firebase user has been created.
Firebase.Auth.FirebaseUser newUser = task.Result;
Debug.LogFormat("Firebase user created successfully: {0} ({1})",
newUser.DisplayName, newUser.UserId);
});
}
else if (!CheckRegisterDataIntegrity())
{
HandleRegistrationErrors(new AggregateException("passwords do not match"));
}
}
上面是我从Firebase文档中直接获得的Registration函数,它非常简单
FetchRegisterInputValues();
函数获取电子邮件和密码,CheckRegisterDataIntegrity()
将密码与表单中的密码构型进行比较,最后HandleRegistrationErrors(task.Exception);
旨在触发一个弹出面板以显示错误,< / p>
HandleRegistrationErrors(task.Exception);
的外观
private void HandleRegistrationErrors(AggregateException errMsg)
{
print("its here from the errors method " + errMsg.Message);
registerErrorPopup.OpenNotification();
registerErrorPopup.description = errMsg.Message;
}
它正在使用资产商店中的UI资产,.OpenNotification();
启动动画并弹出它,然后我只是显示消息。
现在,我遇到两个问题,第一个是当Firebase遇到错误并且if (task.IsFaulted)
条件为true时,应调用HandleRegistrationErrors
函数,对?。好吧,这确实是发生了什么,除了仅调用print("it's here from the errors method " + errMsg.Message);
行而其他函数未执行之外,我起初以为这是资产问题,但我尝试手动进行(创建了一个本机UI团结一致,并使用SetActive()方法启动popUp),但再次仅执行print方法,我认为这是因为
CreateUserWithEmailAndPasswordAsync
是异步的,我应该相应地处理错误,但是我真的不知道该如何处理,并且没有文档可以找到。
第二个问题是由于task.Exception.Message
总是会向我返回“发生一个或多个错误”,因此如何获取正确的错误消息。而task.Exception
本身给出了正确的消息,但格式不正确。
答案 0 :(得分:0)
第一个问题是最简单的。要以最小的工作量更新代码,只需将ContinueWith
替换为ContinueWithOnMainThread
即可将逻辑强加到主线程上。另外,如果task.Result
不为null,则应避免调用task.Exception
,因为它只会引发异常(请参见related documentation)。
对于与线程相关的内容:我将详细介绍Firebase和Unity here的线程,您可以阅读有关ContinueWithOnMainThread
扩展名here的信息。
对于第二个问题,您遇到的问题是task.Exception
是AggregateException。我通常只是附加一个调试器,并在调试时(或现场的let Crashlytics analyze it)进行检查,并且我的UI状态仅关注成功或失败。如果您想检查错误,我为AggregateException
链接的文档建议执行以下操作:
task.Exception.Handle((e) => Debug.LogError($"Failed because {e}"));
尽管我会使用.Flatten()
或.GetBaseException()
来看看它们是否更易于处理。
我希望这会有所帮助!
-帕特里克