[英]Flutter Listview Filter Not Rebuilding List on Type
我正在使用 StreamProvider 獲取列表,它可以在屏幕上很好地呈現列表。
當我在搜索框中鍵入時,列表不會重新構建,但我可以在我鍵入時看到列表中的列表項被過濾。 為什么列表沒有在屏幕上重建? 我包含盡可能少的代碼。
在此之前我已經過濾了列表,但是通過使用過濾器方法位於構建上下文之上的未來構建器。 但我不知道這是否是問題所在,下面的這個例子適用於其他人,我很困惑。 已經花了整整兩天的時間。
請幫助找出為什么我搜索時列表沒有重建。 我希望我的例子已經足夠了,我很樂意提供任何細節。 謝謝
@override
Widget build(BuildContext context) {
List<NameListData> nameListData = Provider.of<List<NameListData>>(context); // <- PROVIDER LIST
List filteredNames = []; // <- FULL LIST RENDERING FINE ON SCREEN
List userNamesList = filteredNames = nameListData;
return Scaffold(
body: SafeArea(
child: Column(
children: <Widget>[
Container(
child: Row(
children: <Widget>[
Expanded(
child: Padding(
padding: const EdgeInsets.all(9.0),
child: TextField(
onChanged: (value) { // <-- FILTER TEXT FIELD AND METHOD
value.toLowerCase();
setState(() {
filteredNames = userNamesList
.where((name) => name.userName
.toLowerCase()
.contains(value.toLowerCase()))
.toList();
});
},
decoration: kInputSearchDecoration.copyWith(
prefixIcon: Icon(
Icons.search,
color: Colors.blueGrey,
),
),
),
),
)
],
),
),
Expanded(
child: (filteredNames != null)
? ListView.builder( // <--LISTVIEW BUILDER
shrinkWrap: true,
itemCount: filteredNames.length,
itemBuilder: (context, index) {
return Padding(
padding: const EdgeInsets.only(right: 6.0, left: 6.0),
child: GestureDetector(
onTap: () {
navigateToRoutes(filteredNames[index].userName);
},
....
我為完成這項工作所做的是將.where 過濾器添加到提供的列表的末尾。
List< NameListData > nameListData = Provider.of<List< NameListData >>(context)
.where((crags) =>
crags.listName.toLowerCase().contains(_searchText.toLowerCase()))
.toList();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.