函数返回不正确的值[重复]

Posted

技术标签:

【中文标题】函数返回不正确的值[重复]【英文标题】:Function is returning an incorrect value [duplicate] 【发布时间】:2021-09-26 03:37:46 【问题描述】:

我正在尝试检查用户是否已登录。即使用户已登录,它也会将值返回为 false,尽管它应该返回 true。

  isUserLoggedIn() 
    bool? loggedIn = false;
    FirebaseAuth.instance.authStateChanges().listen((User? user) 
      if (user != null) 
        print("True is getting executed.");
        loggedIn = true;
      
    );
    print("Logged In Value: $loggedIn");
    return loggedIn;
  

下面显示的是上面代码的输出:

I/flutter (18584): Logged In Value: false
I/flutter (18584): false
I/flutter (18584): True is getting executed.

我不确定为什么声明 True is getting executed. 最终会被打印出来。

我怎样才能解决这个问题?

【问题讨论】:

日志语句的顺序应该已经告诉你你做错了什么。内部块是异步运行的,只有在方法返回之后才会执行。 感谢@luk2302 的快速回复。我不知道如何解决它。如果你能给我提供一个非常棒的解决方案 我确实尝试过申请 asyncawait 但它给了我一个警告。 【参考方案1】:

正如@luk2302 的评论所说:首先,您获取以(User? user) 开头并以); 结尾的代码块,您不运行它,只需将其交给FirebaseAuth,然后询问FirebaseAuth: “嘿,当身份验证状态发生变化时,你能运行这段代码吗?谢谢!”。

然后,在交出该代码后,您立即检查登录值 false,一段时间后,FirebaseAuth 运行您交出的代码。此代码将loggedIn 设置为true,这完全没用,因为您的isUserLoggedIn 方法早已返回。

要修复它,您需要将代码移动到 listen() 块中。

不幸的是,你不能在这里这样做:你不能将 return 语句移动到这样的闭包中。

因此,我们需要拓宽视野:您编写的任何代码都调用了isUserLoggedIn?该假定对返回的值做了一些事情,例如,它会显示“登录失败”提示或类似的提示。

THAT 代码需要移动到 listen 块中。这意味着您希望您的 isUserLoggedIn 方法根本不返回任何内容,而是将一个代码块作为参数,然后您可以执行该代码块(或者将其传递 true/false,或者可能是更好的 API 设计,获得两个代码块,一个在登录成功时运行,在登录失败时运行)。

这被称为“回调地狱”。顾名思义,这太可怕了——您最终将所有方法都编写为不返回任何内容,并将代码块作为参数,该代码块将在信息可用时运行。你所有的代码都是无穷无尽的代码块链,任何试图找出代码在哪里执行的尝试都是一场灾难。

许多语言都有“回调地狱”的解决方案。 Here is one blog post about using the concept of a future instead - 如果你只是在网上搜索“dart callback hell”,你可以找到更多。

【讨论】:

非常感谢您的详细解释。这清楚地说明了为什么它不起作用。

以上是关于函数返回不正确的值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 const char* 返回值丢失了两个字符?但是在返回之前打印正确的值[重复]

python中的Max和Min方法,返回不正确的值[重复]

Java不断返回不正确的答案[重复]

min 函数返回的值不是最小/最小 [重复]

UITableview返回不正确的索引路径行[重复]

java.lang.ArrayStoreException:将不正确类型的值分配给 Object [] 数组时 [重复]