gpt4 book ai didi

android - 使用 StreamBuilder 从 Firebase 加载数据之前,Flutter 显示红色错误屏幕,如何修复?

转载 作者:行者123 更新时间:2023-12-05 00:16:35 29 4
gpt4 key购买 nike

我正在从 firebase 获取数据并使用该数据制作卡片。显示用户的某些数据从数据库中,数据加载正常,但 1 秒或更长时间会出现红色错误屏幕。我希望这个问题消失,我会向你展示我的代码。有人可以帮我看看出了什么问题吗?我不知道我做错了什么,发生这种情况并且我收到错误

getter 'uid' 被调用为 null。接收者:空尝试调用: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,
),
));
});
}


}

最佳答案

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

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

String userid;
void _getUser() async {
FirebaseUser user = await FirebaseAuth.instance.currentUser();
userid=user.uid;
}

现在在卡片构建器小部件中,我摆脱了额外的东西,并在初始化状态下简单地调用 _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,
),
));
}

});
}
}

最后的更改是添加一个条件检查快照是否有数据。将特定文档字段保存在最终变量中对我的情况也有很大帮助,即

final title=userDocument[widget.text];

最后添加了一个 else 条件来模仿显示正在加载的文本的相同卡片界面。如果您愿意,您可以使用 CirculorIndicator,这也对我有用,这对于界面来说看起来更自然。

关于android - 使用 StreamBuilder 从 Firebase 加载数据之前,Flutter 显示红色错误屏幕,如何修复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58380075/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com