0Pricing
Android Academy · درس

ViewModel وLiveData

تجاوزوا تغييرات الإعدادات باستخدام ViewModel. اعرضوا تدفقات بيانات تفاعلية باستخدام LiveData، وراقبوها في Activities وFragments.

ViewModel وLiveData درس مجاني في Android Academy على CoddyKit. هذا هو الدرس 1 من أصل 6. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Android Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Android Academy 6 دروس في المجموع.

مشكلة Activities

يؤدي تخزين البيانات مباشرةً في Activity إلى مشكلتين رئيسيتين:

  • عند تدوير الهاتف، تُدمّر Activity ثم يُعاد إنشاؤها، فتفقد جميع بياناتك
  • إذا جلبت البيانات من الشبكة في onCreate، فسيُعاد جلبها عند كل تدوير، وهذا إهدار للموارد

يحل ViewModel المشكلتين.

ما هو ViewModel؟

ViewModel هو أحد مكوّنات بنية Android، ويقوم بما يلي:

  • يبقى أثناء تغيّرات الإعداد، مثل تدوير الشاشة وتغيير السمة
  • يحتفظ بالبيانات المتعلقة بواجهة المستخدم ومنطق الأعمال
  • لا يُدمّر إلا عندما يغادر المستخدم الشاشة نهائيًا

قاعدة عامة: إذا كان ينبغي للبيانات أن تبقى بعد تدوير الشاشة، فضعها في ViewModel.

إنشاء ViewModel

مدّد ViewModel وأضفه إلى تبعيات Gradle:

// app/build.gradle:
// implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0'
// implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.7.0'

import androidx.lifecycle.ViewModel

class CounterViewModel : ViewModel() {

    var count = 0
        private set

    fun increment() {
        count++
    }

    fun reset() {
        count = 0
    }
}

الحصول على ViewModel في Activity

استخدم ViewModelProvider أو المفوض by viewModels() للحصول على مثيل ViewModel:

import androidx.activity.viewModels

class CounterActivity : AppCompatActivity() {

    private lateinit var binding: ActivityCounterBinding
    // Android manages the ViewModel lifecycle — never instantiate it yourself
    private val viewModel: CounterViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityCounterBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // This shows the count is preserved after rotation!
        binding.tvCount.text = viewModel.count.toString()

        binding.btnPlus.setOnClickListener {
            viewModel.increment()
            binding.tvCount.text = viewModel.count.toString()
        }
    }
}

ما هي LiveData؟

LiveData هي حاوية بيانات قابلة للمراقبة. تراقب واجهة المستخدم قيم LiveData، وتتحدّث تلقائيًا عند تغيّر القيمة.

  • مدركة لدورة الحياة، فلا تحدّث إلا المراقبين النشطين، ولا تحدث أعطال عندما تكون Activity في الخلفية
  • محدّثة دائمًا، إذ يحصل المراقبون الجدد على أحدث قيمة فورًا

LiveData في ViewModel

استخدم MutableLiveData بشكل خاص، إذ يستطيع ViewModel الكتابة فيها، واعرضها علنًا على هيئة LiveData، بحيث لا تستطيع واجهة المستخدم سوى مراقبتها:

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

class CounterViewModel : ViewModel() {

    private val _count = MutableLiveData(0)
    val count: LiveData<Int> = _count  // read-only for the UI

    fun increment() {
        _count.value = (_count.value ?: 0) + 1
    }

    fun reset() {
        _count.value = 0
    }
}

مراقبة LiveData في Activity

استدعِ .observe(lifecycleOwner) { value -> } للاستجابة للتغييرات:

class CounterActivity : AppCompatActivity() {

    private val viewModel: CounterViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // ...

        // Automatically updates TextView whenever count changes
        viewModel.count.observe(this) { count ->
            binding.tvCount.text = count.toString()
        }

        binding.btnPlus.setOnClickListener { viewModel.increment() }
        binding.btnReset.setOnClickListener { viewModel.reset() }
    }
}

مقارنة LiveData وState Flow

تُعد LiveData الأسلوب التقليدي. وغالبًا ما تستخدم شيفرة Kotlin الحديثة StateFlow من Kotlin Coroutines بدلًا منها:

  • StateFlow — مبني على coroutines ولا يعتمد على Android
  • يُجمع باستخدام repeatOnLifecycle في Activity
  • أنسب لإدارة الحالات المعقدة

كلاهما يعمل جيدًا؛ فـ LiveData أبسط للبدء، بينما ستجد StateFlow في التطبيقات الأكبر.

ViewModel مع عدة مراقبين

يمكن لعدة مكوّنات في واجهة المستخدم مراقبة LiveData نفسها. فعلى سبيل المثال، يمكن لكل من TextView وحالة التمكين لزر Button الاستجابة لقيمة البيانات نفسها في ViewModel، من دون أي شيفرة إضافية في ViewModel.

يفصل ذلك بين المسؤوليات بوضوح: يحتفظ ViewModel بالحالة، بينما تراقب واجهة المستخدم البيانات وتعرضها فقط.

تحقق سريع

متى يتم تدمير ViewModel؟

مراجعة: ViewModel وLiveData

أصبحت الآن تعرف كيفية إنشاء واجهات مستخدم مدركة لدورة الحياة:

  • يبقى ViewModel أثناء تغيّرات الإعداد، مثل تدوير الشاشة
  • استخدم by viewModels() للحصول على ViewModel في Activity
  • نمط MutableLiveData بشكل خاص وLiveData بشكل عام
  • راقب التغييرات باستخدام .observe(this) { value -> updateUI(value) }
  • تتحدّث واجهة المستخدم تلقائيًا، ولا حاجة إلى تحديث يدوي

التالي: حفظ البيانات نهائيًا باستخدام قاعدة بيانات Room.

الأسئلة الشائعة

هل درس «ViewModel وLiveData» مجاني؟

نعم — نص درس «ViewModel وLiveData» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Android Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Android Academy 6 دروس في المجموع.

ماذا ستتعلم في «ViewModel وLiveData»؟

تجاوزوا تغييرات الإعدادات باستخدام ViewModel. اعرضوا تدفقات بيانات تفاعلية باستخدام LiveData، وراقبوها في Activities وFragments. تتمرن على Android Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Android Academy؟

لا تُشترط خبرة سابقة. Android Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 6.

كم من الوقت يستغرق درس «ViewModel وLiveData»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Android Academy هذا؟

نعم. كل درس في Android Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. ViewModel وLiveData
  2. قاعدة بيانات Room
  3. Coroutines والدوال المعلّقة
  4. نمط Repository
  5. مكوّن Navigation
  6. حقن التبعيات باستخدام Hilt
← العودة إلى Android Academy