Firebase 颤振:未来建筑商造成的红色屏幕
我的FlatterFirebase应用程序首先检查用户的状态。如果用户是专业人士,Firebase 颤振:未来建筑商造成的红色屏幕,firebase,flutter,future,builder,Firebase,Flutter,Future,Builder,我的FlatterFirebase应用程序首先检查用户的状态。如果用户是专业人士,mypagepro屏幕将显示,否则将显示mypage。这是我的代码 @override Widget build(BuildContext context) { return FutureBuilder( future: FirebaseFirestore.instance .collection('crews') .doc(user.uid)
mypagepro
屏幕将显示,否则将显示mypage
。这是我的代码
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: FirebaseFirestore.instance
.collection('crews')
.doc(user.uid)
.get(),
builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
if (snapshot.data['isPro'] == true) {
return MyPagePro();
} else {
return MyPage();
}
});
}
}
}
@覆盖
小部件构建(构建上下文){
回归未来建设者(
未来:FirebaseFirestore.instance
.收款(“船员”)
.doc(user.uid)
.get(),
生成器:(BuildContext上下文,异步快照){
if(snapshot.data['isPro']==true){
返回MyPagePro();
}否则{
返回MyPage();
}
});
}
}
}
问题是,检查用户状态需要很长时间,以至于在最终显示mypage
或mypagepro
屏幕之前会出现一个红色屏幕
我想显示
mypage
或mypagepro
屏幕,但不显示这样的红色屏幕。检查用户状态时如何避免出现此红色屏幕?您正在尝试访问尚未接收的数据属性。尝试使用以下代码
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: FirebaseFirestore.instance
.collection('crews')
.doc(user.uid)
.get(),
builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
if (snapshot.hasData && snapshot.data["isPro"]) {
return myPagePro();
} else {
return MyPage();
}
});
}
}
}
@覆盖
小部件构建(构建上下文){
回归未来建设者(
未来:FirebaseFirestore.instance
.收款(“船员”)
.doc(user.uid)
.get(),
生成器:(BuildContext上下文,异步快照){
if(snapshot.hasData&&snapshot.data[“isPro”]){
返回myPagePro();
}否则{
返回MyPage();
}
});
}
}
}
您应该检查快照是否有数据
试试这个:
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: FirebaseFirestore.instance
.collection('crews')
.doc(user.uid)
.get(),
builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
if (snapshot.hasData && snapshot.data['isPro'] == true) {
return MyPagePro();
} else {
return MyPage();
}
});
}
}
}
@覆盖
小部件构建(构建上下文){
回归未来建设者(
未来:FirebaseFirestore.instance
.收款(“船员”)
.doc(user.uid)
.get(),
生成器:(BuildContext上下文,异步快照){
if(snapshot.hasData&&snapshot.data['isPro']==true){
返回MyPagePro();
}否则{
返回MyPage();
}
});
}
}
}
需要验证使用吗
snapshot.hasData?myPagePro():MyPage()
@覆盖
小部件构建(构建上下文){
回归未来建设者(
未来:FirebaseFirestore.instance
.收款(“船员”)
.doc(user.uid)
.get(),
生成器:(BuildContext上下文,异步快照)=>
snapshot.hasData?myPagePro():MyPage()
);
}
}
}
如果isPro
为false,这将导致问题。逻辑不会返回widget。很好地捕捉到@YoBo。让我来修正我在我的帖子里修正了它,我们同时发布了。干杯不要在对FutureBuilder的调用中创建未来,这将在每次调用小部件的build()时重新执行fetch。相反,在initState中创建未来,并在FutureBuilder中引用它。
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: FirebaseFirestore.instance
.collection('crews')
.doc(user.uid)
.get(),
builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) =>
snapshot.hasData ? myPagePro() : MyPage()
);
}
}
}