从JSON响应颤振防止在ListView中显示空值
我有一个API响应中联系人的从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
列表视图
,我想省去所有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,您能帮我解决代码吗?嗨,谢谢您的回答,但我仍然收到相同的错误!