Firebase 颤振:未来建筑商造成的红色屏幕

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)

我的FlatterFirebase应用程序首先检查用户的状态。如果用户是专业人士,
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()
          );
        }
      }
    }