【发布时间】:2020-07-06 19:12:28
【问题描述】:
我正在使用 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);
},
....
【问题讨论】:
-
我现在正在关注这个,如果它正常工作,我会更新我的答案:stackoverflow.com/questions/60333739/…