تكرار السؤال: …
الإجابة المختصرة
يفصل بيانات ومنطق الواجهة عن دورة حياة الشاشة، ويبقى حيًا في الذاكرة أثناء إعادة إنشاء الـ Activity عند تدوير الجهاز ولا ينتهي إلا بإغلاق الشاشة نهائيًا.
الشرح
يُنشأ الـ ViewModel بواسطة ViewModelProvider وتديره ViewModelStoreOwner. عند حدوث Configuration Change كدوران الشاشة، لا يُدمر الـ ViewModel بل يُعاد ربطه بنسخة الـ Activity الجديدة. يستدعى onCleared() الخاص به فقط عند انتهاء دورة حياة المالك الحقيقية (استدعاء finish() أو خروج المستخدم من الـ Backstack).
مثال بالكود
class UserViewModel : ViewModel() {
private val _users = MutableStateFlow<List<User>>(emptyList())
val users: StateFlow<List<User>> = _users.asStateFlow()
override fun onCleared() {
super.onCleared()
// تنظيف الموارد والاشتراكات النشطة
}
}أخطاء شائعة
- تمرير مرجع للـ Activity أو Context أو أي كائن View داخل الـ ViewModel، مما يسبب تسريب ذاكرة مؤكدًا (Memory Leak).
- إنشاء نسخة ViewModel يدويًا عبر UserViewModel() بدلاً من استخدام ViewModelProvider أو Delegate من Jetpack (by viewModels()).