سبب المشكلة هو عدم عمل rebuild للواجهة بعد تعديل قيمة العناصر المفلترة (ألتي هي نتيجة إدخال المستخدم).
الحل:
تعريف مصفوفة/قائمة بجميع القيم all_Data
تعريف مصفوفة/قائمة سوف تحوي النتائج results
عند إدخال المستخدم لأي قيمة
نبحث ضمن مصفوفة all_Data ونعمل فلترة للنتائج ونخزنهم في results
نعمل set State لتحديث العرض
ضمن صف الحالة نعرف المصفوفتين،
final List<Map<String, dynamic>> all_Data = [
{"id": 1, "name": "Andy", "age": 29},
{"id": 2, "name": "Aragon", "age": 40},
....
];
List<Map<String, dynamic>> results = [];
@override
initState() {
results = all_Data; // ممكن وضع جميع القيم بشكل ابتدائي
super.initState();
}
ثم عمل فلترة حسب حقل معين ضمن القائمة
// دالة البحث تستقبل كلمة للبحث عنها
void _runFilter(String enteredKeyword) {
List<Map<String, dynamic>> filtered_results = []; // مصفوفة مؤقتة للنتيجة
// بحث فارغ
if (enteredKeyword.isEmpty) {
filtered_results = all_Data;
} else {
// عمل فلترة و بحث
filtered_results = all_Data
.where((user) =>
user["name"].toLowerCase().contains(enteredKeyword.toLowerCase()))
.toList();
}
// تحديث الواجهة
setState(() {
results = filtered_results;
});
}
يمكن استدعاء دالة البحث و الفلترة في حدث onchange
TextField(
onChanged: (value) => _runFilter(value),
),