【发布时间】:2021-07-20 19:31:33
【问题描述】:
我有一个来自 API 响应的联系人 listView,我想忽略所有 firstname 和 lastname 为 NULL 的联系人,因为我得到的是 NoSuchMethodError。
我尝试使用return contact.fields.all.firstname == null ? Container() : InkWell(child: Container(...)) 条件并返回一个空容器,但这只会在 UI 中留下一个空白空间,因此我希望在将其呈现到 UI 本身之前过滤掉所有空联系人,因此我使用了snapshot.data.contacts.removeWhere((key, value) => 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",
}
},
"...": {
"..." : "..."
}
API_Manager 类:
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)));
}),
【问题讨论】:
-
过滤掉你的列表从列表中删除空值,然后传递给listview。
-
我试过了,但我无法让它工作它仍然给出了 NoSuchMethodError,你能帮我解决一下代码吗?
标签: json flutter rest listview dart