【问题标题】:dart future method with bool return type always returns false具有布尔返回类型的飞镖未来方法总是返回 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。我相信它与处理它的顺序有关,但我根本无法修复它。

【问题讨论】:

    标签: flutter dart


    【解决方案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 方法可能更简单。
    猜你喜欢
    • 2017-11-23
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多