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



我正在调用class方法,该方法与main.dart的主方法位于不同的文件中。在这里,我试图获取用户的会话状态。我不确定我做错了什么,当从主方法调用时,返回值总是返回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类方法内的print语句如果启用,则返回true,这是预期的值,但从main方法调用getSessionStatus方法,然后打印状态变量的值总是返回false。我相信这与处理顺序有关,但我根本无法解决。

您不能检查用户是否使用FirebaseAuth.instance.authStateChanges()登录,因为此方法只在用户状态更改时通知。

您可以使用FirebaseAuth.instance.currentUser属性:

class Authenticate {
Future<bool> getSessionStatus() async {
return FirebaseAuth.instance?.currentUser != null;
}
}

您不能等待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

所以你实际上没有在等待任何事情。

最新更新