StateFlow وSharedFlow
اعرض الحالة التفاعلية من تطبيقك
StateFlow وSharedFlow درس مجاني في Android Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Android Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Android Academy 4 دروس في المجموع.
التدفقات الساخنة
على خلاف التدفقات الباردة، فإن StateFlow وSharedFlow ساخنان؛ إذ يوجدان بشكل مستقل عن جامعيهما ويمكن مشاركتهما بين جامعين متعددين.
StateFlow هو حاوية حالة
يحتفظ StateFlow دائماً بقيمة حالية واحدة. ويتلقى الجامعون الجدد أحدث قيمة فوراً. وهو مناسب تماماً لحالة واجهة المستخدم.
private val _count = MutableStateFlow(0)
val count: StateFlow<Int> = _count.asStateFlow()تحديث StateFlow
عيّن .value مباشرةً أو استخدم update لتنفيذ عملية قراءة وتعديل وكتابة ذرّية.
_count.value++
// or, atomically:
_count.update { it + 1 }يجمع StateFlow القيم ويزيل التكرارات
يحتفظ StateFlow بأحدث قيمة فقط (الدمج)، ويتخطى الإصدار إذا كانت القيمة الجديدة مساوية للقديمة. ويؤدي ذلك إلى تجنب تحديثات واجهة المستخدم الزائدة.
استخدام SharedFlow للأحداث
لا يتطلب SharedFlow قيمة حالية، ويمكنه إعادة إصدار عدد قابل للتهيئة من الإصدارات السابقة. وهو مناسب للأحداث التي تحدث مرة واحدة، مثل التنقل أو عرض snackbar.
private val _events = MutableSharedFlow<String>()
val events: SharedFlow<String> = _events.asSharedFlow()إصدار الأحداث
أصدر الأحداث إلى SharedFlow من داخل coroutine.
fun onSave() {
viewModelScope.launch {
_events.emit("Saved!")
}
}لماذا لا نستخدم StateFlow للأحداث
يحتفظ StateFlow بآخر قيمة، لذا سيعيد جامع الاشتراك من جديد (بعد تدوير الشاشة) تلقي الحدث القديم، وقد ينفذ التنقل مرتين مثلاً. أما SharedFlow فيتجنب إعادة الإصدار افتراضياً.
تهيئة SharedFlow
اضبط replay وextraBufferCapacity للتحكم في التخزين المؤقت وسلوك الضغط العكسي.
MutableSharedFlow<String>(
replay = 0,
extraBufferCapacity = 1
)تحويل Flow بارد إلى StateFlow
استخدم stateIn لتحويل المصدر السابق البارد إلى StateFlow مشترك ضمن نطاق ViewModel.
val uiState = repo.stream()
.stateIn(
viewModelScope,
SharingStarted.WhileSubscribed(5000),
UiState()
)الاختيار بينهما
- StateFlow → حالة الشاشة الحالية (تحتوي دائماً على قيمة).
- SharedFlow → أحداث مؤقتة (تُنفّذ مرة واحدة).
جمع كليهما
اجمع StateFlow باستخدام collectAsStateWithLifecycle في Compose؛ واجمع أحداث SharedFlow داخل LaunchedEffect لمعالجتها مرة واحدة.
LaunchedEffect(Unit) {
vm.events.collect { msg -> showSnackbar(msg) }
}تحقق سريع
اختبر مدى فهمك لـ StateFlow وSharedFlow.
مراجعة
لقد تعلمت:
- إن StateFlow هو حاوية حالة ساخنة ومُدمِجة، لها قيمة حالية.
- إن SharedFlow هو تدفق أحداث ساخن مع إمكانية تكوين إعادة التشغيل.
- استخدم StateFlow للحالة، وSharedFlow للأحداث التي تحدث مرة واحدة.
- يحوّل
stateInالتدفقات الباردة إلى StateFlow.
الأسئلة الشائعة
هل درس «StateFlow وSharedFlow» مجاني؟
نعم — نص درس «StateFlow وSharedFlow» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Android Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Android Academy 4 دروس في المجموع.
ماذا ستتعلم في «StateFlow وSharedFlow»؟
اعرض الحالة التفاعلية من تطبيقك تتمرن على Android Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Android Academy؟
لا تُشترط خبرة سابقة. Android Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «StateFlow وSharedFlow»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Android Academy هذا؟
نعم. كل درس في Android Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أساسيات Coroutine ونطاقاتها
- viewModelScope وDispatchers
- أساسيات Kotlin Flow
- StateFlow وSharedFlow