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

时间:2019-08-01 09:29:38

标签: flutter dart firebase-authentication

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

在将更新后的 firebase_auth 软件包更新为0.12.0之前,一切工作均处于最佳状态,方法“ signInWithEmailAndPassword()”和“ createUserWithEmailAndPassword()”引发错误“ A “ AuthResult”类型的值不能分配给“ FirebaseUser”类型的变量。 尝试更改变量的类型,或将右侧的类型强制转换为'FirebaseUser'“ ,因此我添加了强制转换作为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上成功创建了新创建的帐户,但是该应用程序不会在下一页上显示,但是一旦我重新加载,它就会从登录并创建帐户后(退出工作正常)出现的页面开始>

7 个答案:

答案 0 :(得分:14)

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

因此,您不必进行任何类型的强制转换,只需重构代码即可采用新更改:

Action must be plain objects. Use custom middleware for async actions.

答案 1 :(得分:12)

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

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

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

答案 2 :(得分:4)

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

答案 3 :(得分:3)

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

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

该应用程序可以在真实设备上正常运行,但控制台中没有错误,但是Visual Studio Code在用户下方的末尾显示红色下划线并输出错误:

  

未为类“ FirebaseUser”定义吸气剂“用户”。   尝试导入定义“用户”的库,将名称更正为现有吸气剂的名称,或者定义一个名为“用户”的吸气剂或字段。

[解决方案] 重新启动VS代码。 VS Code使用旧的库,直到重新启动为止。

答案 4 :(得分:1)

  • 在firebase_auth 0.18.0 + 1上使用User代替FirebaseUser

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

答案 5 :(得分:0)

已更改,您应该做的是 AuthResult result = await _firebaseAuth.signInWithEmailAndPassword( email: email, password: password); FirebaseUser user = result.user;

答案 6 :(得分:0)

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

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