【问题标题】:Prevent null values from showing up in ListView from JSON response Flutter防止空值从 JSON 响应 Flutter 显示在 ListView 中
【发布时间】:2021-07-20 19:31:33
【问题描述】:

我有一个来自 API 响应的联系人 listView,我想忽略所有 firstnamelastname 为 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


【解决方案1】:
snapshot.data.contacts.removeWhere(
  (key, value) => (
    (contact.fields.all.firstname == null || contact.fields.all.firstname == '') &&
    (contact.fields.all.lastname == null || contact.fields.all.lastname == '')
  )
);

【讨论】:

  • 您好,感谢您的回答,但我仍然遇到同样的错误!
猜你喜欢
  • 1970-01-01
  • 2019-04-17
  • 1970-01-01
  • 1970-01-01
  • 2016-10-24
  • 2016-12-02
  • 2020-03-22
  • 1970-01-01
  • 2020-04-29
相关资源
最近更新 更多