如何解决“ Future <dynamic>”不是“ FirebaseUser”类型错误的子类型

时间:2020-05-05 08:11:15

标签: firebase flutter future

我有一个FirebaseActions类,该类正在进行注册并为我工作。我在其中添加了getCurrentUser方法。我从HomeScreen小部件调用该函数。我需要将返回的值(type = FirebaseUser)放入我的HomeScreen中的变量中,才能到达loggingInUser.email。但是我得到这个错误。我的问题;有什么办法可以将FirebaseUser类型数据转换为Future类型变量?当我在HomeScreen而不是FirebasAction类中编写此函数时,它可以工作,但这是最佳实践吗?

FirebaseActions类

static getCurrentUser(context) async {
    final user = await _auth.currentUser().catchError((error) {
      Scaffold.of(context).showSnackBar(AppSnackBar.appSnackBar(error.message));
    });

    if (user != null) {
      return user;
    }
  }

主屏幕小部件

class _HomeScreenState extends State<HomeScreen> {

  FirebaseUser loggedInUser;

  @override
  void initState() {
    super.initState();
    loggedInUser = FirebaseActions.getCurrentUser(context);
    print(loggedInUser.toString());
  }

3 个答案:

答案 0 :(得分:2)

未指定方法的返回类型,并且方法也是异步的,因此必须在调用的地方等待。

 static Future<FirebaseUser> getCurrentUser(context) async {

另外,在呼叫处添加等待状态。

loggedInUser = await FirebaseActions.getCurrentUser(context);

更新:

创建新函数并调用该函数。

callme() async{  
 loggedInUser = FirebaseActions.getCurrentUser(context);
    print(loggedInUser.toString());
}

初始状态:

 @override
  void initState() {
    super.initState();
    callme();
  }

答案 1 :(得分:2)

由于没有在getCurrentUser()函数中指定返回类型,所以出现此错误。

用下面的代码替换您的代码,一切正常。

要解决此问题: 检查以下代码:可以正常运行:

Firebase操作类

// give your function a return type
static Future<FirebaseUser> getCurrentUser(context) async {
    final user = await _auth.currentUser().catchError((error) {
      Scaffold.of(context).showSnackBar(AppSnackBar.appSnackBar(error.message));
    });

    if (user != null) {
      return user;
    }
  }

主屏幕小部件

class _HomeScreenState extends State<HomeScreen> {

  FirebaseUser loggedInUser;

  @override
  void initState() {
    super.initState();
    call the function here
    logInUser();
    print(loggedInUser.toString());
  }

我希望这会有所帮助

更新

// create a new function to log in user
void logInUser() async {
 // await the result because you are invoking a future method
    loggedInUser = await FirebaseActions.getCurrentUser(context);
}

答案 2 :(得分:1)

这是我在初始化状态下处理异步功能的方式:

FirebaseActions.getCurrentUser(context).then((val){loggedInUser = val});

还要确保在异步函数中指定返回类型。

Future<FirebaseUser> getCurrentUser(context) async {...