我在尝试登录或注册时收到错误消息“错误类型‘AuthResult’不是类型转换中‘FirebaseUser’类型的子类型”

Posted

技术标签:

【中文标题】我在尝试登录或注册时收到错误消息“错误类型‘AuthResult’不是类型转换中‘FirebaseUser’类型的子类型”【英文标题】:I'm getting an error "Error type 'AuthResult' is not a subtype of type 'FirebaseUser' in type cast" when I'm trying to login or signup 【发布时间】:2019-12-09 20:49:50 【问题描述】:

我正在为我的大学项目制作一个颤振应用程序,我正在添加一个登录和注册页面并通过 Firebase 对其进行身份验证,当我点击登录时,调试控制台显示 “错误类型 'AuthResult' 是不是类型转换中“FirebaseUser”类型的子类型”,当我在此错误后重新加载应用程序时,它成功登录。

firebase_auth 包更新到 0.12.0 之前,一切运行良好,在此更新之后,方法“signInWithEmailAndPassword()”和“createUserWithEmailAndPassword()”抛出错误 “A “AuthResult”类型的值不能分配给“FirebaseUser”类型的变量。 尝试更改变量的类型,或将右侧类型转换为“FirebaseUser”,因此我添加了一个转换as FirebaseUser,它修复了错误并且应用程序已成功构建但当我点击登录或创建帐户时,调试控制台说错误类型'AuthResult'不是类型转换中'FirebaseUser'类型的子类型

firebase_auth 0.12.0更新前的主要登录和创建账号功能代码

Future<String> signIn(String email, String password) async 
FirebaseUser user = await 
FirebaseAuth.instance.signInWithEmailAndPassword(
    email: email, password: password);
return user.uid;


Future<String> createUser(String email, String password) async 
FirebaseUser user = await 
FirebaseAuth.instance.createUserWithEmailAndPassword(
    email: email, password: password);
return user.uid;

上面的代码运行良好, 更新后(firebase_auth 0.12.0)同样的代码开始抛出这个错误,

A value of type 'AuthResult' can't be assigned to a variable of type 
'FirebaseUser'.
Try changing the type of the variable, or casting the right-hand type to 
'FirebaseUser'.dart(invalid_assignment)

我通过投射“FirebaseUser”修复了错误,如下所示

Future<String> signIn(String email, String password) async 
FirebaseUser user = await 
FirebaseAuth.instance.signInWithEmailAndPassword(
    email: email, password: password) as FirebaseUser;
return user.uid;


Future<String> createUser(String email, String password) async 
FirebaseUser user = await 
FirebaseAuth.instance.createUserWithEmailAndPassword(
    email: email, password: password) as FirebaseUser;
return user.uid;

这个新代码在编译时没有引发错误,但是当我尝试登录或创建新帐户时,它会在调试控制台中引发错误 错误类型“AuthResult”不是类型中“FirebaseUser”类型的子类型 投掷 并且新创建的帐户已在 firebase 上成功创建,但该应用程序不会进入下一页,但是一旦我重新加载它就会从登录和创建帐户后应该出现的页面开始(退出工作正常)

【问题讨论】:

【参考方案1】:

这是插件中的一项重大更改,并在此处记录 https://pub.dev/packages/firebase_auth#0120

所以你不应该做任何类型的转换,你只需要重构你的代码以采用新的变化:

FirebaseUser user = (await FirebaseAuth.instance.
signInWithEmailAndPassword(email: email, password: password))
.user;

【讨论】:

非常感谢您对我的帮助,现在没有错误但仍然没有切换到主页(应该在登录后出现的页面),调试控制台显示“已签名in”没有错误,但也没有继续。希望能帮到你 我认为这可能是另一个问题,但与 firebase_auth 无关,在您的问题中,您没有提到您是如何过渡到 homepage 的。我想你最好在另一个问题中提出这一点 我确实有一个主屏幕,但这部分只是一个业务逻辑。你能帮我在 Flutter 中进行实时跟踪吗?【参考方案2】:

我面临同样的问题。只需修改为:

final FirebaseUser user = (await _auth.signInWithCredential(credential)).user;

见https://github.com/flutter/flutter/issues/38757#issuecomment-522307525

【讨论】:

你帮我省了几个小时的麻烦。上帝保佑你!【参考方案3】:

我有同样的错误并将代码更改为:

FirebaseUser user = (await _firebaseAuth.signInWithEmailAndPassword(email: email, password: password)).user;

应用程序在真实设备上按预期运行,控制台中没有错误,但 Visual Studio Code 在用户下方显示红色下划线并输出错误:

没有为“FirebaseUser”类定义吸气剂“用户”。 尝试导入定义 'user' 的库,将名称更正为现有 getter 的名称,或定义名为 'user' 的 getter 或字段。

[解决方案] 重启 VS Code。 VS Code 使用旧库直到重新启动。

【讨论】:

重新启动 VS 代码后,错误仍然存​​在,但是重新启动我的计算机就可以了。谢谢楼主【参考方案4】:

课程已重命名。 “AuthResult”已重命名为“UserCredential”,“FirebaseUser”已重命名为“User”。

【讨论】:

【参考方案5】:

在 firebase_auth 0.18.0+1 上使用 User 而不是 FirebaseUser

final User user = (await FirebaseAuth.instance.signInWithEmailAndPassword(
                email: 'abc@gmail.com',
                password: 'abc',
               )).user;

【讨论】:

【参考方案6】:

已经改变了你应该做的是 AuthResult result = await _firebaseAuth.signInWithEmailAndPassword( email: email, password: password); FirebaseUser user = result.user;

【讨论】:

【参考方案7】:

signInWithEmailAndPassword 返回 AuthResult 并且 AuthResult 类包含 FirebaseUser 类型的实例变量 user >。 因此,您必须按以下方式更改代码。

FirebaseUser userDetails = (await FirebaseAuth.instance
          .signInWithEmailAndPassword(Credentialsxxx)).user;
print('sign in : $userDetails.uid');

【讨论】:

以上是关于我在尝试登录或注册时收到错误消息“错误类型‘AuthResult’不是类型转换中‘FirebaseUser’类型的子类型”的主要内容,如果未能解决你的问题,请参考以下文章

SQL 异常:用户登录失败

登录和注册在 Angular 8 中不起作用

Codeigniter - 设置 SSL 并收到 404 错误

无效登录/注册时创建错误消息

当我尝试登录注册用户并通过解析启用推送通知时,我的应用程序崩溃

为啥我在通过 IMAP 连接到 Gmail 时收到“需要 Web 登录”消息?