Android 颤振表演';在使用StreamBuilder从firebase加载数据之前出现红色错误屏幕,如何修复?

Android 颤振表演';在使用StreamBuilder从firebase加载数据之前出现红色错误屏幕,如何修复?,android,firebase,firebase-realtime-database,flutter,google-cloud-firestore,Android,Firebase,Firebase Realtime Database,Flutter,Google Cloud Firestore,我正在从firebase获取数据,并使用这些数据制作卡片。显示用户的某些数据 从数据库中,数据加载正常,但在1秒或更长时间内出现红色错误屏幕。我想让它消失我会给你看我的代码。谁能帮我看看出了什么问题吗。我不知道我做错了什么,我得到了错误 对null调用了getter“uid”。 收件人:空 已尝试呼叫:uid 对null调用了方法“[]”。 收件人:空 已尝试呼叫: 这是我的代码,任何帮助都将不胜感激。谢谢 class CardBuilder extends StatefulWidget {

我正在从firebase获取数据,并使用这些数据制作卡片。显示用户的某些数据 从数据库中,数据加载正常,但在1秒或更长时间内出现红色错误屏幕。我想让它消失我会给你看我的代码。谁能帮我看看出了什么问题吗。我不知道我做错了什么,我得到了错误

对null调用了getter“uid”。 收件人:空 已尝试呼叫:uid

对null调用了方法“[]”。 收件人:空 已尝试呼叫:

这是我的代码,任何帮助都将不胜感激。谢谢

class CardBuilder extends StatefulWidget {

  final String title;
  final String text;
  final IconData icon;

  CardBuilder({Key key, this.title,this.text,this.icon}): super(key: key);

  @override
  _CardBuilderState createState() => _CardBuilderState();
}

class _CardBuilderState extends State<CardBuilder> {
  FirebaseUser user;
  String error;

  void setUser(FirebaseUser user) {
    setState(() {
      this.user = user;
      this.error = null;
    });
  }

  void setError(e) {
    setState(() {
      this.user = null;
      this.error = e.toString();
    });
  }

  @override
  void initState() {
    super.initState();
    FirebaseAuth.instance.currentUser().then(setUser).catchError(setError);
  }

  @override
  Widget build(BuildContext context) {
    return StreamBuilder(
        stream: Firestore.instance.collection(UserInformation).document(user.uid).snapshots(),
        builder: (context, snapshot) {
          var userDocument = snapshot.data;
          // User userDocument here ..........
          return Card(
              margin: EdgeInsets.only(left: 20,right: 20,top: 20),
              child: ListTile(
                leading:
                Icon(widget.icon, color: QamaiGreen, size: 20.0),
                title: AutoSizeText(
                  '${widget.title} :   ${userDocument[widget.text]}',
                  style: TextStyle(
                      fontFamily: 'Montserrat',
                      fontWeight: FontWeight.w600,
                      color: QamaiThemeColor,
                      fontSize: 15
                  ),
                  maxLines: 1,
                  maxFontSize: 15,
                  minFontSize: 12,
                ),
              ));
        });
  }


} 
class CardBuilder扩展StatefulWidget{
最后的字符串标题;
最终字符串文本;
最终的Iconda图标;
卡片生成器({Key-Key,this.title,this.text,this.icon}):超级(Key:Key);
@凌驾
_CardBuilderState createState()=>\u CardBuilderState();
}
类_CardBuilderState扩展状态{
FirebaseUser用户;
字符串错误;
void setUser(FirebaseUser用户){
设置状态(){
this.user=用户;
this.error=null;
});
}
无效设置错误(e){
设置状态(){
this.user=null;
this.error=e.toString();
});
}
@凌驾
void initState(){
super.initState();
FirebaseAuth.instance.currentUser().then(setUser).catchError(setError);
}
@凌驾
小部件构建(构建上下文){
返回流生成器(
流:Firestore.instance.collection(UserInformation).document(user.uid.snapshots(),
生成器:(上下文,快照){
var userDocument=snapshot.data;
//此处的用户用户文档。。。。。。。。。。
回程卡(
页边距:仅限边集(左:20,右:20,顶:20),
孩子:ListTile(
领先:
图标(widget.Icon,颜色:QamaiGreen,大小:20.0),
标题:AutoSizeText(
“${widget.title}:${userDocument[widget.text]}”,
样式:TextStyle(
fontFamily:“蒙特塞拉特”,
fontWeight:fontWeight.w600,
颜色:Qamaithemocolor,
尺寸:15
),
maxLines:1,
maxFontSize:15,
minFontSize:12,
),
));
});
}
} 

您可以在加载数据时显示进度指示器 如下图所示

return StreamBuilder(
    stream: Firestore.instance.collection(UserInformation).document(user.uid).snapshots(),
    builder: (context, snapshot) {
    //==========show progress============
     if (!snapshot.hasData) {
        return CircularProgressIndicator()            
      }
      var userDocument = snapshot.data;
      // User userDocument here ..........

所以在尝试了一些东西之后,我终于纠正了这个错误。决定发布答案,因为这个问题在网上没有任何解决方案。至少我找不到。希望这能帮助有同样问题的人

我首先做的是声明一个包含user.uid值的字符串

String userid;
void _getUser() async {
  FirebaseUser user = await FirebaseAuth.instance.currentUser();
  userid=user.uid;
}
现在在card builder小部件中,我去掉了多余的东西,只在init状态下调用了_getUser()方法

class _CardBuilderState extends State<CardBuilder> {

  @override
  void initState() {
    super.initState();
    _getUser();
  }

  @override
  Widget build(BuildContext context) {
    return StreamBuilder(
        stream: Firestore.instance.collection(UserInformation).document(userid).snapshots(),
        builder: (context, snapshot) {
          if(snapshot.hasData)
            {
              final userDocument = snapshot.data;
              final title=userDocument[widget.text];
              return Card(
                  margin: EdgeInsets.only(left: 20,right: 20,top: 20),
                  child: ListTile(
                    leading:
                    Icon(widget.icon, color: QamaiGreen, size: 20.0),
                    title: AutoSizeText(
                      '${widget.title} :   $title',
                      style: TextStyle(
                          fontFamily: 'Montserrat',
                          fontWeight: FontWeight.w600,
                          color: QamaiThemeColor,
                          fontSize: 15
                      ),
                      maxLines: 1,
                      overflow: TextOverflow.ellipsis,
                      maxFontSize: 15,
                      minFontSize: 9,
                    ),
                  ));
            }
          else{
            return Card(
                margin: EdgeInsets.only(left: 20,right: 20,top: 20),
                child: ListTile(
                  leading:
                  Icon(widget.icon, color: QamaiGreen, size: 20.0),
                  title: AutoSizeText(
                    'LOADING...',
                    style: TextStyle(
                        fontFamily: 'Montserrat',
                        fontWeight: FontWeight.w600,
                        color: QamaiThemeColor,
                        fontSize: 15
                    ),
                    maxLines: 1,
                    overflow: TextOverflow.ellipsis,
                    maxFontSize: 15,
                    minFontSize: 9,
                  ),
                ));
          }

        });
  }
}

最后,添加了一个else条件来模拟显示加载文本的同一个卡片界面。如果需要,您可以使用CirculorIndicator,这也适用于我,因为界面看起来更自然。

感谢您的回复,这根本不起作用。对红色屏幕没有影响您的问题您可以加载数据,但在加载数据之前,您会得到一个红色屏幕,您可以使用stream builder initial data的属性来设置初始数据虽然我在回答中的内容对meI非常有效,但我不确定在初始数据中设置什么,您有什么建议吗?
final title=userDocument[widget.text];