我正在调用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
所以你实际上没有在等待任何事情。