首页 > 解决方案 > 如果列表中的项目为空,则列表搜索返回错误 - 阻止搜索

问题描述

我正在尝试实现对列表显示的搜索。列表中有一些字段,null当我尝试搜索它时返回错误(这很明显)。我试图用过滤器方法处理它,但它不起作用。

这是一个示例代码,如果任何一个查询为空,则它不起作用。

var appData = query.isEmpty
              ? data
              : data
                  .where((element) =>
                      element.gateApptNum
                          .toLowerCase()
                          .contains(query.toLowerCase()) ||
                      element.truckPlateNbr
                          .toLowerCase()
                          .contains(query.toLowerCase()) ||
                      element.gateAppointment[0].containerNum != null
                          ? element.gateAppointment[0].containerNum
                          : 'false'
                              .toLowerCase()
                              .contains(query.toLowerCase()) ||
                      element.truckPlateNbr
                          .toLowerCase()
                          .contains(query.toLowerCase()))
                  .toList();

如果我尝试处理过滤器中的错误,以下是我得到的错误

在此处输入图像描述

标签: flutterdart

解决方案


在描述中的代码片段中,您使用where 方法过滤null值,该方法采用返回bool值的谓词,但在三元表达式的片段中,如果条件是,true那么您返回element.gateAppointment[0].containerNum的可能是 aString而不是bool

我认为只评估条件以过滤掉null值会更好,如下所示。

.where((element) =>
                  element.gateApptNum
                      .toLowerCase()
                      .contains(query.toLowerCase()) ||
                  element.truckPlateNbr
                      .toLowerCase()
                      .contains(query.toLowerCase()) ||
                  element.gateAppointment[0].containerNum != null)

如果要更改元素,则可以使用map after where

如果你想退货,element.gateAppointment[0].containerNum那么你可以这样退货:

var appData = query.isEmpty
          ? data
          : data
              .where((element) =>
                  element.gateApptNum
                      .toLowerCase()
                      .contains(query.toLowerCase()) ||
                  element.truckPlateNbr
                      .toLowerCase()
                      .contains(query.toLowerCase()) ||
                  element.gateAppointment[0].containerNum != null
              )
              .map((element) => element.gateAppointment[0].containerNum)
              .toList();

推荐阅读