所描述的问题涉及 Flutter 应用程序中的
onSearch
函数,该函数使用 Firestore 根据用户在搜索字段中输入的搜索词来检索和过滤用户列表。以下是问题的详细描述:
目标:
onSearch
功能的目标是根据用户在搜索字段中输入的搜索词来过滤用户列表。过滤后的用户应显示在屏幕上。
问题:执行搜索时,过滤后的用户列表不包含任何项目,即使应该存在与搜索词匹配的用户。这表明过滤未按预期工作,并且未根据搜索正确过滤用户。
分析:要找出问题的原因,需要检查几个点:
QuerySnapshot
的正确接收和转换。filteredUsers
列表与已过滤的用户。综上所述,所描述的问题涉及无法根据搜索词正确过滤用户列表,需要对过滤过程进行彻底的分析和修改才能解决。
以下是您尝试过的操作以及预期发生的情况的描述:
你尝试了什么:
onSearch
函数,以根据用户输入的搜索词过滤用户列表。onSearch
函数中构建了一个 Firestore 查询,以使用 isGreaterThanOrEqualTo
和 isLessThanOrEqualTo
条件按用户姓名过滤用户。filteredUsers
列表。filteredUsers
列表是否有任何更改。您期望发生什么:
onSearch
函数根据该词过滤用户列表。filteredUsers
列表。filteredUsers
列表,相应地显示过滤后的用户。void onSearch(String search) {
// Convert the search term to lowercase and uppercase for case-insensitive matching
String searchLower = search.toLowerCase();
String searchUpper = search.toUpperCase();
// Check if the search term is empty
if (search.isEmpty) {
setState(() {
// If search term is empty, set filteredUsers to the entire list of users
filteredUsers = List.from(users);
});
return;
}
// Perform Firestore query to filter users based on the search term
FirebaseFirestore.instance
.collection("Users")
.where("name", isGreaterThanOrEqualTo: searchLower)
.where("name", isLessThanOrEqualTo: '${searchUpper}z')
.snapshots()
.listen((QuerySnapshot<Map<String, dynamic>> snapshot) {
setState(() {
// Convert the snapshot into a list of QueryDocumentSnapshot
filteredUsers = snapshot.docs.cast<QueryDocumentSnapshot<Map<String, dynamic>>>().toList();
});
// Debugging: Print the filtered users
print("Filtered Users: $filteredUsers");
});
}
您似乎正在此处进行字符串搜索:
String searchLower = search.toLowerCase();
String searchUpper = search.toUpperCase();
...
FirebaseFirestore.instance
.collection("Users")
.where("name", isGreaterThanOrEqualTo: searchLower)
.where("name", isLessThanOrEqualTo: '${searchUpper}z')
由于这些是字符串,因此顺序是按字典顺序排列的,按照该顺序,小写字符位于大写字符之后。作为参考,我们使用这个 ASCII 表:
]search
是
a
或 A
,那么您的代码将搜索 "name" >= "a" AND "name" <= "A"
或以 ASCII 值 "name" >= 141 AND name <= 101
进行搜索,这始终是一个空结果集