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