我正在从firestore数据库中获取值,并显示与用户相关的所有详细信息,但当我试图在正文中添加下面提到的条件时,它不起作用。我只想如果用户为空,然后将用户移动到初始屏幕,如果它不为空,则希望检查状态,如果它是"阻止"的,则我希望用户转到阻止屏幕,而不是带有底部选项卡的主屏幕。但我不知道为什么它不起作用。这是带有底部选项卡的主屏幕,在这个屏幕中,我试图比较这样的值,但我认为没有得到正确的值。
body: currentUser == null ?
Center(child: Splash())
:currentUser.userStatus == 'isBlocked'
? BlockUser():
Center(
child: Container(),
如果放置!=像这样签名,然后它就工作了。
body: currentUser == null ?
Center(child: Splash())
:currentUser.userStatus != 'isBlocked'
? BlockUser():
Center(
child: Container(),
我以这种方式获取值,它显示了与用户相关的所有数据:-
CreateAccountData currentUser;
void initState() {
super.initState();
_getCurrentUser();
_getMatches();
getUser().then((value) {
currentUser = value;
userStatus = value.userStatus;
});
}
Future<CreateAccountData> getUser() async {
final User user = auth.currentUser;
return docRef.doc(user.uid).get().then((m) => CreateAccountData.fromDocument(m));
}
我认为Builder应该在这里工作得最好
body: Builder(
builder: (BuildContext context) {
if(currentUser == null){
return Center(child: Splash())
}
if(currentUser.userStatus == 'isBlocked'){
return BlockUser();
}
return Center(child: Container();
},
),
https://api.flutter.dev/flutter/widgets/Builder-class.html
使用Future
构建器等待未来作为完成
body: FutureBuilder(
future: getUser(),
builder: (context, snapshot) {
if(snapshot.connectionState == ConnectionState.done){
if(currentUser == null){
return Splash();
}else if(currentUser.userStatus == 'isBlocked'){
return BlockUser();
}else{
return Container();
}
}else{
return _loadingWidget();
}
},
);
并将您的getUser()
更新为
Future<CreateAccountData> getUser() async {
final User user = auth.currentUser;
currentUser = CreateAccountData.fromDocument(await docRef.doc(user.uid).get());
}
此外,从initState
方法中删除getUser
调用
void initState() {
super.initState();
_getCurrentUser();
_getMatches();
}
问题:您的代码的问题是,您的构建方法没有等待将来完成,并且您面临检查用户状态和代码始终导航到splash的问题。