Flutter 如果StreamBuilder为null,则在flatter中显示不同的小部件
我已设置StreamBuilder从特定用户检索数据,但如果用户仍然没有任何可用数据,我希望显示不同的小部件。 怎么做? 这是我的密码:Flutter 如果StreamBuilder为null,则在flatter中显示不同的小部件,flutter,google-cloud-firestore,Flutter,Google Cloud Firestore,我已设置StreamBuilder从特定用户检索数据,但如果用户仍然没有任何可用数据,我希望显示不同的小部件。 怎么做? 这是我的密码: class _CollectDataState extends State<CollectData> { final String phone; final String wife; final String location; _CollectDataState({this.phone, this.wife, this.loca
class _CollectDataState extends State<CollectData> {
final String phone;
final String wife;
final String location;
_CollectDataState({this.phone, this.wife, this.location});
Stream<DocumentSnapshot> getData() async* {
FirebaseUser user = await FirebaseAuth.instance.currentUser();
yield* Firestore.instance
.collection('dataCollection')
.document(user.uid)
.snapshots();
}
@override
Widget build(BuildContext context) {
return StreamBuilder(
stream: getData(),
builder: (context, snapshot) {
return ListView.builder(
shrinkWrap: true,
itemCount: 2,
// ignore: missing_return
itemBuilder: (BuildContext context, int ) {
if (snapshot.hasData) {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
Text(
snapshot.data['phone'],
style: TextStyle(
color: Colors.blue,
fontWeight: FontWeight.bold),
),
],
);
}
else{
return NoData();
}
class\u CollectDataState扩展状态{
最终字符串电话;
最后的妻子;
最终管柱位置;
_CollectDataState({this.phone,this.layer,this.location});
流getData()异步*{
FirebaseUser=等待FirebaseAuth.instance.currentUser();
yield*Firestore.instance
.collection('dataCollection'))
.document(user.uid)
.快照();
}
@凌驾
小部件构建(构建上下文){
返回流生成器(
流:getData(),
生成器:(上下文,快照){
返回ListView.builder(
收缩膜:对,
物品计数:2,
//忽略:缺少返回
itemBuilder:(BuildContext,int){
if(snapshot.hasData){
返回行(
mainAxisAlignment:mainAxisAlignment.spaceAround,
儿童:[
正文(
snapshot.data['phone'],
样式:TextStyle(
颜色:颜色,蓝色,
fontWeight:fontWeight.bold),
),
],
);
}
否则{
返回NoData();
}
您可以尝试以下方法:
Widget build(BuildContext context) {
return StreamBuilder(
stream: getData(),
builder: (context, snapshot) {
if(snapshot.hasData && snapshot.data!=null){
return ListView.builder(
shrinkWrap: true,
itemCount: 2,
itemBuilder: (BuildContext context, int ) {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
Text(snapshot.data['phone'],
style: TextStyle(
color: Colors.blue,
fontWeight: FontWeight.bold),
),
],
);
},
);
}
else{
return NoData();
}
},
);
}
小部件构建(构建上下文){
返回流生成器(
流:getData(),
生成器:(上下文,快照){
if(snapshot.hasData&&snapshot.data!=null){
返回ListView.builder(
收缩膜:对,
物品计数:2,
itemBuilder:(BuildContext,int){
返回行(
mainAxisAlignment:mainAxisAlignment.spaceAround,
儿童:[
文本(snapshot.data['phone'],
样式:TextStyle(
颜色:颜色,蓝色,
fontWeight:fontWeight.bold),
),
],
);
},
);
}
否则{
返回NoData();
}
},
);
}
请参阅此处了解更多信息:您可以添加一个
if语句
来检查该语句,并返回一个不同的小部件。类似下面的操作应该可以
@override
Widget build(BuildContext context) {
return StreamBuilder(
stream: getData(),
builder: (context, snapshot) {
if (snapshot.data == null) {
// you can show whatever you want here
return Text("Nothing to show");
}
....
});
}
这不是最好的解决方案,因为快照。加载数据时,数据
可以为null
根据要获取的数据,您可能需要检查是否(snapshot.data.isEmpty){..}
来区分加载状态和数据不可用状态。@override
@override
Widget build(BuildContext context) {
return StreamBuilder(
stream: getData(),
builder: (context, snapshot) {
return snapshot?.data??false? Column(
children: <Widget>[. //user data widget with data
]):Container(); //use any widget like loader
小部件构建(构建上下文){
返回流生成器(
流:getData(),
生成器:(上下文,快照){
返回快照?数据?错误?列(
子项:[.//包含数据的用户数据小部件
]):Container();//使用任何小部件,如loader
以这种方式作为错误,必须提供一个非空字符串。感谢我在上面编辑了Nodata()是一个文本小部件:类Nodata扩展了无状态小部件{@override Widget build(BuildContext context){return Column(children:[Text('Nessun Dato'),]);}},如果我放置else,{return error Widget“得到了相同的结果,我得到了:方法“[]”在null上被调用。接收者:null尝试调用:[](“电话”)请共享完整的函数。好的,我尝试放置所有代码,因为我在这里编写的代码有限。。