从JSON响应颤振防止在ListView中显示空值

从JSON响应颤振防止在ListView中显示空值,json,flutter,rest,listview,dart,Json,Flutter,Rest,Listview,Dart,我有一个API响应中联系人的列表视图,我想省去所有firstname和lastname为空的联系人,因为我得到的是NoSuchMethodError 我尝试使用return contact.fields.all.firstname==null?Container():InkWell(child:Container(…)条件并返回一个空容器,但这只会在UI中留下一个空白空间,因此我希望在UI中呈现之前过滤掉所有空联系人,因此我使用了snapshot.data.contacts.removehere

我有一个API响应中联系人的
列表视图
,我想省去所有
firstname
lastname
为空的联系人,因为我得到的是
NoSuchMethodError

我尝试使用
return contact.fields.all.firstname==null?Container():InkWell(child:Container(…)
条件并返回一个空容器,但这只会在UI中留下一个空白空间,因此我希望在UI中呈现之前过滤掉所有空联系人,因此我使用了
snapshot.data.contacts.removehere((键,值)=>contact.fields.all.firstname==null&&contact.fields.all.lastname==null)但它仍然不起作用

在对UI影响不大的情况下,是否有其他方法可以过滤掉它或返回任何空的小部件

我的JSON示例代码:

{
    "total": "187144",
    "contacts": {
        "897": {
            "isPublished": true,
        "id": 897,
            "fields": {
                "core": {
                    "points": {
                        "id": "47",
                        "label": "Points"
                    },
                    "firstname": {
                        "id": "2",
                        "label": "First Name",
                        "value": "Jason"
                    },
                    "lastname": {
                        "id": "3",
                        "label": "Last Name",
                        "value": "Lamuda"
                    },
                    "...": {
                             "..." : "..."
                            }
                },
            "ipAddresses": [
                {
                    "ip": "70.127.91.131",
                    "ipDetails": {
                        "city": "Bradenton",
                        "region": "Florida",
                        "timezone": "America/New_York",
                    }
                },
                 "...": {
                             "..." : "..."
                            }
Future<ContactsModel> getContacts() async {
    var client = http.Client();
    var contactsModel;
    String getContactUrl =
        'https://example.com/ma/api/contacts';
    String basicAuth = 'Basic exampleauthkey';
    try {
      var response = await client.get(getContactUrl, headers: <String, String>{
        'content-type': 'application/json',
        "Accept": "application/json",
        'authorization': basicAuth,
      });
      print(response.statusCode);
      developer.log(response.body);
      if (response.statusCode == 200) {
        var jsonString = response.body;
        var jsonMap = json.decode(jsonString);
        contactsModel = ContactsModel.fromJson(jsonMap);
      }
    } catch (Exception) {
      return contactsModel;
    }
    return contactsModel;
  }
child: FutureBuilder<ContactsModel>(
                      future: _contactsModel,
                      builder: (BuildContext context,
                          AsyncSnapshot<ContactsModel> snapshot) {
                        if (snapshot.hasData) {
                          return ListView.separated(
                            shrinkWrap: true,
                            padding: const EdgeInsets.all(8),
                            itemCount: snapshot.data.contacts.length,
                            itemBuilder: (BuildContext context, int index) {
                              List keys = snapshot.data.contacts.keys.toList();
                              List values =
                                  snapshot.data.contacts.values.toList();
                              var contact = values[index]; //Single contact object here
                              final contactID = contact.id.toString();
                              return InkWell(
                                      onTap: () {
                                        Navigator.push(
                                            context,
                                            MaterialPageRoute(
                                                builder: (_) => ViewContact(
                                                    contact, contactID)));
                                      },
                                      child: Container(
                                        height: 50,
                                        color: Colors.white,
                                        child: Column(
                                          mainAxisAlignment:
                                              MainAxisAlignment.start,
                                          crossAxisAlignment:
                                              CrossAxisAlignment.start,
                                          children: <Widget>[
                                            Text(
                                              contact.fields.all.firstname +
                                                  " " +
                                                  contact.fields.all.lastname,
                                              style: TextStyle(fontSize: 16),
                                            ),
                                          ],
                                        ),
                                      ),
                                    );
                            },
                            separatorBuilder:
                                (BuildContext context, int index) {
                              return SizedBox(
                                height: 5,
                              );
                            },
                          );
                        } else
                          return Center(
                              child: CircularProgressIndicator(
                                  backgroundColor: Colors.blueGrey[700],
                                  valueColor: AlwaysStoppedAnimation<Color>(
                                      Colors.cyan)));
                      }),
API\u管理器类:

{
    "total": "187144",
    "contacts": {
        "897": {
            "isPublished": true,
        "id": 897,
            "fields": {
                "core": {
                    "points": {
                        "id": "47",
                        "label": "Points"
                    },
                    "firstname": {
                        "id": "2",
                        "label": "First Name",
                        "value": "Jason"
                    },
                    "lastname": {
                        "id": "3",
                        "label": "Last Name",
                        "value": "Lamuda"
                    },
                    "...": {
                             "..." : "..."
                            }
                },
            "ipAddresses": [
                {
                    "ip": "70.127.91.131",
                    "ipDetails": {
                        "city": "Bradenton",
                        "region": "Florida",
                        "timezone": "America/New_York",
                    }
                },
                 "...": {
                             "..." : "..."
                            }
Future<ContactsModel> getContacts() async {
    var client = http.Client();
    var contactsModel;
    String getContactUrl =
        'https://example.com/ma/api/contacts';
    String basicAuth = 'Basic exampleauthkey';
    try {
      var response = await client.get(getContactUrl, headers: <String, String>{
        'content-type': 'application/json',
        "Accept": "application/json",
        'authorization': basicAuth,
      });
      print(response.statusCode);
      developer.log(response.body);
      if (response.statusCode == 200) {
        var jsonString = response.body;
        var jsonMap = json.decode(jsonString);
        contactsModel = ContactsModel.fromJson(jsonMap);
      }
    } catch (Exception) {
      return contactsModel;
    }
    return contactsModel;
  }
child: FutureBuilder<ContactsModel>(
                      future: _contactsModel,
                      builder: (BuildContext context,
                          AsyncSnapshot<ContactsModel> snapshot) {
                        if (snapshot.hasData) {
                          return ListView.separated(
                            shrinkWrap: true,
                            padding: const EdgeInsets.all(8),
                            itemCount: snapshot.data.contacts.length,
                            itemBuilder: (BuildContext context, int index) {
                              List keys = snapshot.data.contacts.keys.toList();
                              List values =
                                  snapshot.data.contacts.values.toList();
                              var contact = values[index]; //Single contact object here
                              final contactID = contact.id.toString();
                              return InkWell(
                                      onTap: () {
                                        Navigator.push(
                                            context,
                                            MaterialPageRoute(
                                                builder: (_) => ViewContact(
                                                    contact, contactID)));
                                      },
                                      child: Container(
                                        height: 50,
                                        color: Colors.white,
                                        child: Column(
                                          mainAxisAlignment:
                                              MainAxisAlignment.start,
                                          crossAxisAlignment:
                                              CrossAxisAlignment.start,
                                          children: <Widget>[
                                            Text(
                                              contact.fields.all.firstname +
                                                  " " +
                                                  contact.fields.all.lastname,
                                              style: TextStyle(fontSize: 16),
                                            ),
                                          ],
                                        ),
                                      ),
                                    );
                            },
                            separatorBuilder:
                                (BuildContext context, int index) {
                              return SizedBox(
                                height: 5,
                              );
                            },
                          );
                        } else
                          return Center(
                              child: CircularProgressIndicator(
                                  backgroundColor: Colors.blueGrey[700],
                                  valueColor: AlwaysStoppedAnimation<Color>(
                                      Colors.cyan)));
                      }),
Future getContacts()异步{
var client=http.client();
var接触模型;
字符串getContactUrl=
'https://example.com/ma/api/contacts';
字符串basicAuth='Basic exampleauthkey';
试一试{
var response=wait client.get(getContactUrl,标题:{
“内容类型”:“应用程序/json”,
“接受”:“应用程序/json”,
“授权”:basicAuth,
});
打印(响应状态码);
developer.log(response.body);
如果(response.statusCode==200){
var jsonString=response.body;
var jsonMap=json.decode(jsonString);
contactsModel=contactsModel.fromJson(jsonMap);
}
}捕获(例外){
返回联系人模型;
}
返回联系人模型;
}
用户界面代码:

{
    "total": "187144",
    "contacts": {
        "897": {
            "isPublished": true,
        "id": 897,
            "fields": {
                "core": {
                    "points": {
                        "id": "47",
                        "label": "Points"
                    },
                    "firstname": {
                        "id": "2",
                        "label": "First Name",
                        "value": "Jason"
                    },
                    "lastname": {
                        "id": "3",
                        "label": "Last Name",
                        "value": "Lamuda"
                    },
                    "...": {
                             "..." : "..."
                            }
                },
            "ipAddresses": [
                {
                    "ip": "70.127.91.131",
                    "ipDetails": {
                        "city": "Bradenton",
                        "region": "Florida",
                        "timezone": "America/New_York",
                    }
                },
                 "...": {
                             "..." : "..."
                            }
Future<ContactsModel> getContacts() async {
    var client = http.Client();
    var contactsModel;
    String getContactUrl =
        'https://example.com/ma/api/contacts';
    String basicAuth = 'Basic exampleauthkey';
    try {
      var response = await client.get(getContactUrl, headers: <String, String>{
        'content-type': 'application/json',
        "Accept": "application/json",
        'authorization': basicAuth,
      });
      print(response.statusCode);
      developer.log(response.body);
      if (response.statusCode == 200) {
        var jsonString = response.body;
        var jsonMap = json.decode(jsonString);
        contactsModel = ContactsModel.fromJson(jsonMap);
      }
    } catch (Exception) {
      return contactsModel;
    }
    return contactsModel;
  }
child: FutureBuilder<ContactsModel>(
                      future: _contactsModel,
                      builder: (BuildContext context,
                          AsyncSnapshot<ContactsModel> snapshot) {
                        if (snapshot.hasData) {
                          return ListView.separated(
                            shrinkWrap: true,
                            padding: const EdgeInsets.all(8),
                            itemCount: snapshot.data.contacts.length,
                            itemBuilder: (BuildContext context, int index) {
                              List keys = snapshot.data.contacts.keys.toList();
                              List values =
                                  snapshot.data.contacts.values.toList();
                              var contact = values[index]; //Single contact object here
                              final contactID = contact.id.toString();
                              return InkWell(
                                      onTap: () {
                                        Navigator.push(
                                            context,
                                            MaterialPageRoute(
                                                builder: (_) => ViewContact(
                                                    contact, contactID)));
                                      },
                                      child: Container(
                                        height: 50,
                                        color: Colors.white,
                                        child: Column(
                                          mainAxisAlignment:
                                              MainAxisAlignment.start,
                                          crossAxisAlignment:
                                              CrossAxisAlignment.start,
                                          children: <Widget>[
                                            Text(
                                              contact.fields.all.firstname +
                                                  " " +
                                                  contact.fields.all.lastname,
                                              style: TextStyle(fontSize: 16),
                                            ),
                                          ],
                                        ),
                                      ),
                                    );
                            },
                            separatorBuilder:
                                (BuildContext context, int index) {
                              return SizedBox(
                                height: 5,
                              );
                            },
                          );
                        } else
                          return Center(
                              child: CircularProgressIndicator(
                                  backgroundColor: Colors.blueGrey[700],
                                  valueColor: AlwaysStoppedAnimation<Color>(
                                      Colors.cyan)));
                      }),
child:FutureBuilder(
未来:_contactsModel,
生成器:(BuildContext上下文,
异步快照(快照){
if(snapshot.hasData){
返回ListView.separated(
收缩膜:对,
填充:常量边集。全部(8),
itemCount:snapshot.data.contacts.length,
itemBuilder:(构建上下文,int索引){
List keys=snapshot.data.contacts.keys.toList();
列表值=
snapshot.data.contacts.values.toList();
var contact=values[index];//此处为单个联系人对象
最终联系人id=contact.id.toString();
回墨槽(
onTap:(){
导航器。推(
上下文
材料路线(
生成器:()=>ViewContact(
联系人(contactID));
},
子:容器(
身高:50,
颜色:颜色,白色,
子:列(
主轴对准:
MainAxisAlignment.start,
横轴对齐:
CrossAxisAlignment.start,
儿童:[
正文(
contact.fields.all.firstname+
" " +
contact.fields.all.lastname,
样式:TextStyle(字体大小:16),
),
],
),
),
);
},
分离器生成器:
(BuildContext上下文,int索引){
返回大小框(
身高:5,,
);
},
);
}否则
返回中心(
子对象:循环压缩机指示器(
背景颜色:颜色。蓝灰色[700],
valueColor:始终停止动画(
颜色(青色);
}),

筛选出列表从列表中删除空值,然后传递到listview。我尝试过,但无法正常工作。它仍然发出NoSuchMethodError,您能帮我解决代码吗?嗨,谢谢您的回答,但我仍然收到相同的错误!