[英]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.