如何在Flutter上基于多个类别有效地过滤列表?

时间:2019-07-25 09:35:53

标签: flutter

假设我有一个显示加油站列表的屏幕,像这样。 enter image description here

共有3个下拉菜单:左侧用于根据品牌(壳牌,星号等)进行过滤,中间用于根据距离进行排序(升序和降序),右侧用于根据设施进行过滤(ATM,厕所等)。如果3个下拉菜单中的所有下拉列表均显示“全部”,则将显示原始列表。否则...一些情况。

仅过滤“ Esso”:

enter image description here

过滤具有ATM的“ Esso”:

enter image description here

更改这些下拉菜单的值时,列表必须相应地处于filterend位置。到目前为止,我已经完成了处理设施下拉菜单的工作。它有很多嵌套的if-else块,很容易让我感到困惑,例如:

 else if (dropdownBrand == "All" && dropdownDistance != "All"){
   if (dropdownDistance == "Near to far"){

     _displayedList = _petrolList;
     _displayedList.sort((a,b) => a.price.compareTo(b.price));
     _displayedList = _displayedList
         .where((PetrolItem item) => item.facilities.toString().toLowerCase() == dropdownFacilities.toString().toLowerCase())
         .toList();
   }
   else {
     _displayedList = _petrolList;
     _displayedList.sort((a,b) => b.price.compareTo(a.price));
     _displayedList = _displayedList
          .where((PetrolItem item) => item.facilities.toString().toLowerCase() == dropdownFacilities.toString().toLowerCase())
          .toList();
   }
}
else if (dropdownBrand != "All" && dropdownDistance == "All"){
  _displayedList = _petrolList;
  _displayedList = _displayedList
      .where((PetrolItem item) => item.brand.toString().toLowerCase() == dropdownBrand.toString().toLowerCase() && item.facilities.toString().toLowerCase() == dropdownFacilities.toString().toLowerCase())
      .toList();
}
else if (dropdownBrand == "All" && dropdownDistance == "All"){
  _displayedList = _petrolList;
  _displayedList = _displayedList
      .where((PetrolItem item) => item.facilities.toString().toLowerCase() == dropdownFacilities.toString().toLowerCase())
      .toList();
}

完整代码:here

如何简化排序和过滤代码?

1 个答案:

答案 0 :(得分:0)

尝试如下所示:

_displayedList = getListByBrand(brand:_selectedBrand)
_displayedList = getListByFacility(facility: _selectedFacility)
_displayedList = getListListByDistance(distance: _selectedDistance)


List<outlet> getListByBrand(String brand) {
    if (brand == '') {

        return _displayedList ;
    } else {
        // Apply your filter here.
        return _filteredList ;

    }

}

List<outlet> getListByFacility(String facility) {
    if (facility == '') {

        return _displayedList ;
    } else {
        // Apply your filter here.
        return _filteredList ;

    }

}

ist<outlet> getListListByDistance(String distance) {
    if (distance == '') {

        return _displayedList ;
    } else {
        // Apply your filter here.
        return _filteredList ;

    }

}