代码之家  ›  专栏  ›  技术社区  ›  Sumchans

带有bool返回类型的dart future方法总是返回false

  •  0
  • Sumchans  · 技术社区  · 5 年前

    这里的预期结果是真实的,因为用户当前在系统中并且已经登录。

    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类方法中的print语句,则返回预期值true,但从main方法调用getSessionStatus方法,然后打印状态变量的值总是返回false。我相信这与处理的顺序有关,但我根本无法解决。

    2 回复  |  直到 5 年前
        1
  •  1
  •   enzo    5 年前

    无法检查用户是否已使用登录 FirebaseAuth.instance.authStateChanges()

    你可以用 FirebaseAuth.instance.currentUser property

    class Authenticate {
      Future<bool> getSessionStatus() async {
        return FirebaseAuth.instance?.currentUser != null;
      }
    }
    
        2
  •  1
  •   puelo    5 年前

    你不能等待 StreamSubscription (编译器应该警告您)由返回 FirebaseAuth.instance.authStateChanges().listen(...) . 下面是一个简单的例子来说明正在发生的事情。

    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
    

    所以你实际上没有在等待什么。