collectAsStateWithLifecycle
اجمع التدفقات بأمان وفق دورة الحياة
collectAsStateWithLifecycle درس مجاني في Android Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Android Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Android Academy 4 دروس في المجموع.
جمع التدفقات بأمان
عندما تجمع Composable تدفقًا، فمن الأفضل أن تتوقف عن جمعه أثناء وجود الشاشة في الخلفية، وأن تستأنف الجمع عند عودتها.
الأداة المخصصة لذلك هي collectAsStateWithLifecycle().
مشكلة collectAsState
يواصل collectAsState() العادي جمع البيانات ما دامت Composable موجودة في التركيب، حتى عندما يكون التطبيق في الخلفية.
قد يؤدي ذلك إلى هدر الموارد ومعالجة تحديثات لا يستطيع المستخدم رؤيتها.
التعرّف على collectAsStateWithLifecycle
يوقف هذا الجامع المراعي لدورة الحياة الجمع مؤقتًا عندما تنخفض دورة الحياة عن حالة مستهدفة (STARTED افتراضيًا)، ويستأنفه عند عودتها.
import androidx.lifecycle.compose.collectAsStateWithLifecycle
@Composable
fun Screen(vm: MyViewModel) {
val state by vm.uiState
.collectAsStateWithLifecycle()
Text(state.title)
}التبعية
توجد هذه الوظيفة في وحدة androidx.lifecycle:lifecycle-runtime-compose. أضفها إلى وحدتك حتى يتمكّن الاستيراد من الحل.
// build.gradle (module)
implementation(
"androidx.lifecycle:lifecycle-runtime-compose:2.x.x"
)الحد الأدنى الافتراضي للحالة: STARTED
يكون الجمع نشطًا افتراضيًا عندما تكون دورة الحياة في حالة STARTED على الأقل، أي عندما تكون الشاشة مرئية. وعند انتقالها إلى الخلفية (أدنى من STARTED)، يُعلّق الجمع.
تخصيص الحد الأدنى للحالة
يمكنك تغيير الحد باستخدام minActiveState، مثلًا إلى RESUMED.
val state by vm.uiState.collectAsStateWithLifecycle(
minActiveState = Lifecycle.State.RESUMED
)الاقتران مع StateFlow
يعمل ذلك بشكل مثالي مع StateFlow الذي تتيحه من ViewModel. يحتوي التدفق دائمًا على قيمة حالية، ولذلك يعرض جمعه من جديد أحدث حالة فورًا.
private val _uiState = MutableStateFlow(UiState())
val uiState = _uiState.asStateFlow()لماذا يوفر ذلك العمل؟
إذا كان التدفق يشغّل عملية حسابية مكلفة، مثل تصفية قائمة كبيرة أو تحويل تدفقات، فإن تعليق الجمع في الخلفية يعني أن هذه العملية لا تُنفّذ أثناء غياب المستخدم.
الدمج مع viewModelScope
على جانب المنتج، يشغّل ViewModel غالبًا مسار بياناته ضمن viewModelScope. وباستخدام stateIn، يمكنك حتى إيقاف المصدر العلوي عندما لا يكون هناك جامعون.
val uiState = repository.stream()
.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5000),
initialValue = UiState()
)شرح WhileSubscribed
يبقي WhileSubscribed(5000) المصدر العلوي نشطًا لمدة 5 ثوانٍ بعد مغادرة آخر جامع. ويمنع ذلك إعادة تشغيل العمل أثناء تغييرات الإعدادات القصيرة، مع إيقافه عند مغادرة المستخدم فعليًا.
ملخص أفضل الممارسات
بالنسبة إلى شاشات Compose المدعومة بواسطة ViewModel:
- أتِح
StateFlow. - اجمع باستخدام
collectAsStateWithLifecycle(). - استخدم اختياريًا
stateIn(WhileSubscribed)في المصدر العلوي.
تحقق سريع
اختبر مدى فهمك لجمع التدفقات المراعي لدورة الحياة.
مراجعة
لقد تعلّمت ما يلي:
- يوقف
collectAsStateWithLifecycle()الجمع مؤقتًا في الخلفية. - الحد الافتراضي هو STARTED، ويمكن تعديله عبر
minActiveState. - اقترنه مع
StateFlowوstateIn(WhileSubscribed)لإنشاء مسار فعال.
الأسئلة الشائعة
هل درس «collectAsStateWithLifecycle» مجاني؟
نعم — نص درس «collectAsStateWithLifecycle» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Android Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Android Academy 4 دروس في المجموع.
ماذا ستتعلم في «collectAsStateWithLifecycle»؟
اجمع التدفقات بأمان وفق دورة الحياة تتمرن على Android Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Android Academy؟
لا تُشترط خبرة سابقة. Android Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «collectAsStateWithLifecycle»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Android Academy هذا؟
نعم. كل درس في Android Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- لماذا نستخدم ViewModel؟
- كشف الحالة من ViewModel
- دورة حياة Android
- collectAsStateWithLifecycle