لماذا نستخدم ViewModel؟
تجاوز تغييرات الإعدادات بسلاسة
لماذا نستخدم ViewModel؟ درس مجاني في Android Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Android Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Android Academy 4 دروس في المجموع.
ما هو ViewModel؟
يُعد ViewModel مكوّنًا معماريًا في Android، صُمّم لتخزين البيانات المرتبطة بواجهة المستخدم وإدارتها بطريقة تراعي دورة الحياة.
ويستمر عبر تغييرات التهيئة، مثل تدوير الشاشة، لذلك لا تُدمَّر بياناتكم وتُنشأ من جديد في كل مرة يعيد فيها النظام بناء واجهة المستخدم.
مشكلة تغييرات التهيئة
عند تدوير الجهاز، يقوم Android بتدمير Activity وإعادة إنشائها. وتُفقد أي حالة محفوظة داخل Activity أو Composable.
- يُعاد العداد إلى الصفر.
- تختفي القائمة التي جرى تحميلها.
- قد يُعاد تشغيل طلب الشبكة.
يحل ViewModel هذه المشكلة لأنه يعيش خارج دورة حياة مثيل Activity.
كيف يستمر ViewModel؟
يحافظ الإطار على مثيل ViewModel نفسه حيًا عبر عمليات إعادة الإنشاء. وعند إنشاء Activity الجديدة، يمنحها ViewModel الموجود بدلًا من مثيل جديد.
class CounterViewModel : ViewModel() {
var count = 0
private set
fun increment() {
count++
}
}الحصول على ViewModel في Compose
في Jetpack Compose، تسترجعون ViewModel عادةً باستخدام الدالة المساعدة viewModel(). وتعيد الدالة المثيل نفسه لمالك دورة الحياة.
import androidx.lifecycle.viewmodel.compose.viewModel
@Composable
fun CounterScreen(
vm: CounterViewModel = viewModel()
) {
Text("Count: " + vm.count)
}فصل المسؤوليات
يشجّع ViewModel على تقسيم واضح:
- طبقة واجهة المستخدم (عناصر Composable وActivities) تكتفي بعرض الحالة وتمرير الأحداث.
- ViewModel يحتفظ بالحالة ومنطق الأعمال.
وهذا يجعل واجهة المستخدم أبسط، كما يسهّل اختبار المنطق.
نطاق ViewModel ومالكه
يكون نطاق ViewModel محدّدًا بمالك ViewModelStoreOwner، ويكون هذا المالك عادةً Activity أو Fragment أو إدخالًا في مكدس الرجوع الخاص بالتنقّل.
ويُزال تلقائيًا عندما يُدمَّر ذلك المالك نهائيًا، مثلًا عندما ينهي المستخدم Activity بالضغط على زر الرجوع.
دالة الاستدعاء onCleared
عند تدمير ViewModel نهائيًا، يستدعي الإطار onCleared(). استخدموها لتحرير الموارد التي فتحتموها.
class MyViewModel : ViewModel() {
override fun onCleared() {
super.onCleared()
// cancel jobs, close listeners
}
}ما لا ينبغي وضعه في ViewModel
لا تحتفظوا مطلقًا بمراجع إلى Views أو Activities أو أي Context مرتبط بواجهة المستخدم داخل ViewModel. وبما أن ViewModel يستمر بعد Activity، فإن فعل ذلك يسبب تسرّبات في الذاكرة.
إذا احتجتم إلى application context، فاستخدموا AndroidViewModel بدلًا من ذلك.
AndroidViewModel لسياق التطبيق
عندما تحتاجون فعلًا إلى Context، وسّعوا AndroidViewModel، الذي يوفّر بأمان سياق التطبيق طويل الأمد.
class PrefsViewModel(
app: Application
) : AndroidViewModel(app) {
private val context = getApplication<Application>()
}تمرير وسائط المُنشئ
لحقن التبعيات، مثل مستودع، داخل ViewModel، استخدموا ViewModelFactory أو إطار DI مثل Hilt. وسنتناول Hilt لاحقًا في هذا المسار.
class UserViewModel(
private val repo: UserRepository
) : ViewModel() {
// repo provided via a factory or Hilt
}أهمية ViewModel
تُعد ViewModels ركيزة أساسية في بنية Android الحديثة. فهي تمنحكم:
- الاستمرار عبر تغييرات التهيئة.
- فصلًا واضحًا بين واجهة المستخدم والمنطق.
- إدارة حالة يمكن توقّعها واختبارها.
تحقّق سريع
اختبروا فهمكم لسبب استخدام ViewModels.
مراجعة
تعلّمتم ما يلي:
- يخزّن ViewModel حالة واجهة المستخدم ويستمر عبر تغييرات التهيئة.
- يجب ألا يحتفظ مطلقًا بمراجع إلى View أو Activity لتجنّب التسريبات.
- يكون نطاقه محدّدًا بمالك، ويُزال عبر
onCleared(). - يوفّر
AndroidViewModelسياقًا آمنًا للتطبيق.
الأسئلة الشائعة
هل درس «لماذا نستخدم ViewModel؟» مجاني؟
نعم — نص درس «لماذا نستخدم ViewModel؟» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Android Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Android Academy 4 دروس في المجموع.
ماذا ستتعلم في «لماذا نستخدم ViewModel؟»؟
تجاوز تغييرات الإعدادات بسلاسة تتمرن على Android Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Android Academy؟
لا تُشترط خبرة سابقة. Android Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «لماذا نستخدم ViewModel؟»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Android Academy هذا؟
نعم. كل درس في Android Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- لماذا نستخدم ViewModel؟
- كشف الحالة من ViewModel
- دورة حياة Android
- collectAsStateWithLifecycle