- بواسطة x32x01 ||
لو بتبني ميزة Search في Flutter، غالبًا أول حل بييجي في بالك هو إرسال API Request مع كل حرف المستخدم بيكتبه 😅
لكن الحقيقة إن ده بيعمل مشاكل كبيرة:
هنخلي الكود "يستنى" شوية قبل التنفيذ، ويتأكد إن فيه تغيير حقيقي.
وده بيحسن الأداء بشكل ملحوظ.
لو نسيت الخطوة دي… ممكن يحصل Memory Leak 😬
لو شغلك بسيط → Timer ممكن يكفي
لكن في التطبيقات الاحترافية → RxDart هو الأفضل 💪
الميزة الصح مش اللي تشتغل وبس، لكن اللي تشتغل بكفاءة.
لكن الحقيقة إن ده بيعمل مشاكل كبيرة:
- ضغط غير طبيعي على السيرفر
- استهلاك بيانات وبطارية
- UI بيهنج أو يبقى بطيء
ليه RxDart هو الحل الأفضل للـ Search؟
مكتبة RxDart بتديك أدوات قوية للتحكم في الـ Streams، وده بيساعدك تعمل:- تقليل عدد الطلبات
- تحسين الأداء
- تجربة مستخدم سلسة
الفكرة الأساسية: بدل ما تبعت Request مع كل حرف
بدل ما كل حرف يضرب Request…هنخلي الكود "يستنى" شوية قبل التنفيذ، ويتأكد إن فيه تغيير حقيقي.
تطبيق عملي باستخدام PublishSubject
Code:
final _searchSubject = PublishSubject<String>();
_searchSubject
.debounceTime(Duration(milliseconds: 500))
.distinct()
.listen(_search); شرح أهم الأجزاء
⏱️ debounceTime (فرامل البحث)
دي أهم خطوة 👇- بتخلي الكود يستنى 500ms
- لو المستخدم لسه بيكتب → مفيش Request
- أول ما يوقف → يتم البحث
🔁 distinct (منع التكرار)
بتمنع إرسال نفس الكلمة مرتين:- لو المستخدم كتب نفس النص
- أو عدل ورجع لنفس الكلمة
وده بيحسن الأداء بشكل ملحوظ.
🎯 listen(_search)
هنا بقى التنفيذ الفعلي:- أول ما الشروط تتحقق
- الكلمة تتبعت للـ API
Code:
void _search(String query) {
// Call API here
} استخدام RxDart مع Cubit (أفضل تنظيم للكود)
لما تدمج RxDart مع Cubit أو Bloc، بتحصل على:- فصل كامل بين UI و Logic 🧠
- كود نظيف وسهل الصيانة
- تحكم كامل في حالة البحث
Code:
void onSearchChanged(String query) {
_searchSubject.add(query);
} ليه الطريقة دي أفضل من onChanged العادية؟
⚡ Performance أقوى
- Requests أقل
- استهلاك بيانات أقل
📱 User Experience أفضل
- مفيش Lag
- البحث سلس وسريع
🧼 Clean Code
- الكود منظم
- الـ Logic منفصل عن UI
أهم نصيحة (تجنب Memory Leak)
متنساش تقفل الـ Stream 👇 Code:
@override
Future<void> close() {
_searchSubject.close();
return super.close();
} RxDart vs Timer: أيهم أفضل؟
| الطريقة | التقييم |
|---|---|
| Timer | بسيطة لكن محدودة |
| RxDart | قوية ومرنة وقابلة للتوسع |
لكن في التطبيقات الاحترافية → RxDart هو الأفضل 💪
نصائح احترافية لتحسين ميزة البحث
- استخدم Pagination مع البحث
- اعرض Loading Indicator أثناء البحث
- اعمل Cache للنتائج
- امنع البحث لو النص فاضي
الخلاصة
لو عايز تبني ميزة بحث احترافية في Flutter:- بلاش تبعت Request مع كل حرف ❌
- استخدم RxDart + debounce + distinct ✅
- أداء أعلى 🚀
- استهلاك أقل ⚡
- تجربة مستخدم ممتازة 💯
الميزة الصح مش اللي تشتغل وبس، لكن اللي تشتغل بكفاءة.