具有布尔返回类型的飞镖未来方法总是返回 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的主要内容,如果未能解决你的问题,请参考以下文章

Angular2 Click 方法总是返回 false 值

在 GET 上创建的 RestKit 托管对象总是为 bool 返回 false

始终返回相同布尔值的 Python 函数

js中Boolean类型和Number类型的一些常见方法

如何在返回小部件之前遍历列表以创建地图?颤振 - 飞镖

布尔返回 24