具有布尔返回类型的飞镖未来方法总是返回 false
Posted
技术标签:
【中文标题】具有布尔返回类型的飞镖未来方法总是返回 false【英文标题】:dart future method with bool return type always returns false 【发布时间】:2021-08-29 08:20:59 【问题描述】:我正在调用与 main.dart 的主要方法位于不同文件中的类方法。在这里,我试图获取用户的会话状态。我不确定我做错了什么,从main方法调用返回值总是返回false,但如果在实际方法中打印出来返回true。
这里的预期结果为真,因为用户当前在系统中并已登录。
这是我的主要方法-
Future main() async
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
await Authenticate().getSessionStatus().then((status) =>
print(status)
);
这是我的类方法-
class Authenticate
Future<bool> getSessionStatus() async
bool _isSessionActive = false;
await FirebaseAuth.instance.authStateChanges().listen((User? user)
if (user == null)
//print('User is currently signed out!');
_isSessionActive = false;
else
//print('User is signed in!');
_isSessionActive = true;
);
return _isSessionActive;
Authenticate 类方法中的打印语句,如果打开返回 true,这是预期值,但从 main 方法调用 getSessionStatus 方法然后打印状态变量的值总是返回 false。我相信它与处理它的顺序有关,但我根本无法修复它。
【问题讨论】:
【参考方案1】:您无法检查用户是否使用FirebaseAuth.instance.authStateChanges()
登录,因为此方法仅在用户状态更改时通知。
您可以改用FirebaseAuth.instance.currentUser
property:
class Authenticate
Future<bool> getSessionStatus() async
return FirebaseAuth.instance?.currentUser != null;
【讨论】:
你好 enzo,我在 .then 下看到一条红线。 红线是什么意思? 方法'then'不能被无条件调用,因为receiver可以是'null' 这只是一个警告,但您可以通过将instance?.currentUser
替换为instance.currentUser
来消除它。
谢谢 enzo,为了清楚起见,问号在 dart 中有什么作用?我什么时候应该使用 authStateChanges 方法。你能用一个小场景来解释一下吗?【参考方案2】:
您不能等待FirebaseAuth.instance.authStateChanges().listen(...)
返回的StreamSubscription
(编译器应该警告您)。下面是一个小例子来说明正在发生的事情。
void main() async
bool test = await awaitMe();
print('Main received:' + test.toString());
Future<bool> awaitMe() async
bool innerVal = false;
print('start');
await streamMe().listen((val)
print('Listener received: ' + val.toString());
innerVal = true;
);
print('end');
return innerVal;
Stream<bool> streamMe () async*
yield true;
这将打印:
start
end
Main received:false
Listener received: true
所以你实际上并没有在等待任何事情。
【讨论】:
你好 puelo,这是有道理的,在这种情况下应该从身份验证类方法进行导航?或者正如 enzo 提到的,我应该使用 currentUser 属性来检查用户是否登录? 如果您只对调用该方法的确切时间的当前状态感兴趣,那么 enzo 的答案可能更适合。正如他所说:authStateChanges
是一个侦听器,您可以使用它来收到有关身份验证状态的任何更改的通知(例如,必要时从您的应用中注销用户)
这就是我想要做的,如果用户已经登录,当用户打开应用程序时,如果没有登录页面,则将用户导航到产品页面。
那么我认为 enzos 方法可能更简单。以上是关于具有布尔返回类型的飞镖未来方法总是返回 false的主要内容,如果未能解决你的问题,请参考以下文章