Flutter 如果StreamBuilder为null,则在flatter中显示不同的小部件

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

我已设置StreamBuilder从特定用户检索数据,但如果用户仍然没有任何可用数据,我希望显示不同的小部件。 怎么做? 这是我的密码:

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尝试调用:[](“电话”)请共享完整的函数。好的,我尝试放置所有代码,因为我在这里编写的代码有限。。