函数返回不正确的值[重复]
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 的快速回复。我不知道如何解决它。如果你能给我提供一个非常棒的解决方案 我确实尝试过申请async
和 await
但它给了我一个警告。
【参考方案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* 返回值丢失了两个字符?但是在返回之前打印正确的值[重复]
java.lang.ArrayStoreException:将不正确类型的值分配给 Object [] 数组时 [重复]