簡體   English   中英

Flutter:過濾ListView時刪除重復項

[英]Flutter: remove duplicated items when filtering ListView

我正在像這樣的ListView篩選。

在此處輸入圖片說明

不要說您輸入tsi 那么結果是:

在此處輸入圖片說明

哪個是對的。 並且,如果您清除搜索輸入框,則應顯示默認/原始列表。 而是會有重復的項目。 奇怪的。 在此處輸入圖片說明

這是過濾代碼:

  onSearchTextChanged(String input) async {
    List<ParkingItem> dummySearchList = List<ParkingItem>();
    dummySearchList.addAll(_parkingList);

    if (input.isNotEmpty){
      List<ParkingItem> dummy = List<ParkingItem>();
      dummySearchList.forEach((item){
        if (item.location.toLowerCase().contains(input.toLowerCase())){
          dummy.add(item);
        }
      });

      setState((){
        _parkingList.clear();
        _parkingList.addAll(dummy);
      });
      return;
    }
    else {
      setState(() {
        _parkingList.clear();
        _parkingList.addAll(backup);
      });
    }
  }

這是完整的代碼 怎么了

使用那個dummySearchList和另一個dummy列表,對我來說有點困惑。 我建議您的小部件狀態中包含兩個列表。 一個包含所有項目,基本上是ParkingItem的來源,另一個包含要顯示的項目。

我已經在dartpad中輸入了一些內容,希望對您有所幫助。

List<ParkingItem> _allItems; 
List<ParkingItem> _displayedItems; 

@override
initState() {
  super.initState();
  _allItems = []; // TODO: fetch all items first
  _displayedItems = _allItems; // initially, display all items
}

onSearchTextChanged(String input) async {
  if(input.isNotEmpty) {
    setState(() {
      // set displayed items as a filtered set of allItems, by using `where`
      _displayedItems = _allItems
        .where((ParkingItem item) => item.location.toLowerCase().contains(input.toLowerCase()))
        .toList(); // turn the Iterable back into a List
    });
  } else {
    setState(() {
      // no search field input, display all items
      _displayedItems = _allItems;
    });
  }  
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM