ViewModel — کیا ہے، Android Jetpack میں UI ڈیٹا کا انتظام

مصنف: IT Sectr اشاعت: 2026-02-19 مطالعے کا وقت: 9 منٹ

ViewModel Android Jetpack Architecture کا ایک جزو ہے جو Activity اور Fragment کی زندگی کے دور کو مدنظر رکھتے ہوئے UI ڈیٹا کو ذخیرہ اور منظم کرنے کے لیے ڈیزائن کیا گیا ہے۔ Google I/O 2025 کے مطابق، Jetpack پر بنی جدید Android ایپلی کیشنز کے 82% میں ViewModel استعمال ہوتا ہے۔ عام کلاسوں کے برعکس، ViewModel خود بخود اسکرین گھومنے اور دیگر ترتیباتی تبدیلیوں سے بچ جاتا ہے، ڈیٹا کے نقصان کے بغیر UI کی حالت برقرار رکھتا ہے۔ MVVM (Model-View-ViewModel) فن تعمیر ViewModel پر ایک مرکزی تہہ کے طور پر انحصار کرتا ہے جو کاروباری منطق کو انٹرفیس سے جوڑتا ہے۔

اہم نکات

  • ViewModel — UI ڈیٹا ذخیرہ کرنے کے لیے Jetpack جزو، اسکرین گھومنے اور Activity کی دوبارہ تخلیق کے خلاف مزاحم۔
  • ViewModel کی زندگی کا دور دائرہ کار (Activity/Fragment/Composable) سے منسلک ہے، نہ کہ کسی انفرادی Activity مثال سے۔
  • viewModelScope — ViewModel کے اندر ایک بلٹ ان کوروٹین، ViewModel صاف ہونے پر خود بخود منسوخ ہو جاتی ہے۔
  • ViewModelProvider — Hilt یا Koin کے ذریعے انحصاری انجیکشن کی حمایت کے ساتھ ViewModel بنانے کے لیے فیکٹری۔
  • MVVM میں، ViewModel MVP سے پریزینٹر کو بدل دیتا ہے، LiveData یا StateFlow کے ذریعے کسی مخصوص View سے وابستگی کو ختم کرتا ہے۔

Android میں ViewModel کیا ہے؟

ViewModel Android Jetpack لائبریری کی ایک کلاس ہے جو صارف انٹرفیس سے متعلق ڈیٹا کو ذخیرہ اور منظم کرنے کے لیے ڈیزائن کی گئی ہے، Activity یا Fragment کی زندگی کے دور کو مدنظر رکھتے ہوئے۔ ViewModel کا بنیادی کام ڈیٹا کی تیاری کی منطق کو UI پرت سے الگ کرنا اور ترتیباتی تبدیلیوں جیسے اسکرین گھومنا، تھیم تبدیل کرنا یا مقام تبدیل کرنے کے دوران اس ڈیٹا کو محفوظ رکھنا ہے۔

ViewModel کے آنے سے پہلے، ڈویلپرز UI حالت براہ راست Activity یا Fragment میں ذخیرہ کرتے تھے۔ اسکرین گھمانے پر، Android Activity کو تباہ کرتا ہے اور نیا بناتا ہے — تمام غیر محفوظ شدہ ڈیٹا ضائع ہو جاتا تھا۔ حل onSaveInstanceState() کے ذریعے حالت محفوظ کرنا یا onRetainNonConfigurationInstance() استعمال کرنا تھا، لیکن دونوں طریقوں میں دستی انتظام اور ترتیب سازی کی ضرورت تھی اور پیچیدہ اشیاء کے لیے موزوں نہیں تھے۔ ViewModel اس مسئلے کو فریم ورک کی سطح پر حل کرتا ہے: ڈیٹا UI سے الگ میموری میں رہتا ہے اور Activity کی دوبارہ تخلیق پر خود بخود واپس آ جاتا ہے۔

Android Developers دستاویزات (2025) کے مطابق، ViewModel عمل کی RAM میں ڈیٹا ذخیرہ کرتا ہے — یہ onSaveInstanceState() کے ذریعے Bundle سے بحال کرنے سے 10–50 گنا تیز ہے، جہاں بائٹ صف میں ترتیب سازی کی ضرورت ہوتی ہے۔ ViewModel ان تمام اسکرینوں کے لیے تجویز کیا جاتا ہے جہاں ڈیٹا سادہ قدیم قسم یا سٹرنگ سے زیادہ پیچیدہ ہو۔

ViewModel کی زندگی کا دور: Activity سے فرق

ViewModel کی زندگی کا دور بنیادی طور پر Activity کی زندگی کے دور سے مختلف ہے: ViewModel اسکرین گھومنے پر تباہ نہیں ہوتا اور دائرہ کار کے مکمل ختم ہونے تک (Activity.finish() یا Fragment ہٹایا گیا) زندہ رہتا ہے۔ اس کا مطلب ہے کہ ViewModel میں لوڈ کیا گیا کوئی بھی ڈیٹا نیٹ ورک یا ڈیٹا بیس سے دوبارہ لوڈ کیے بغیر ترتیباتی تبدیلیوں کے دوران دستیاب رہتا ہے۔

Activity تخلیق کے وقت، نظام ViewModelProvider کے ذریعے ViewModel مختص کرتا ہے۔ ViewModelProvider.get(ViewModel::class.java) کی پہلی کال پر ایک نیا ViewModel مثال بنایا جاتا ہے۔ بعد کی کالوں پر (گھومنے کے بعد بھی) وہی مثال واپس آتا ہے۔ ViewModel کی صفائی خود بخود onCleared() کال ہونے پر ہوتی ہے — یہ طریقہ اس وقت بلایا جاتا ہے جب Activity ختم (finish()) ہوتی ہے یا Fragment مکمل طور پر ہٹا دیا جاتا ہے۔ ڈویلپر onCleared() کو اوور رائڈ کر سکتا ہے وسائل آزاد کرنے کے لیے: Flow سے ان سبسکرائب کرنا، کوروٹینز منسوخ کرنا، ساکٹ بند کرنا۔

Google Jetpack دستاویزات میں زور دیتا ہے: ViewModel کے اندر کبھی Activity یا View کا حوالہ ذخیرہ نہ کریں — اس سے میموری رساو ہوتا ہے کیونکہ ViewModel اپنے UI کے ساتھ Activity سے زیادہ زندہ رہتا ہے۔ اس کے بجائے، ViewModel اور UI کے درمیان ڈیٹا منتقل کرنے کے لیے LiveData، StateFlow یا SavedStateHandle استعمال کریں۔

MVVM فن تعمیر میں ViewModel

MVVM (Model-View-ViewModel) پیٹرن میں، ViewModel View (Activity/Fragment) اور Model (ذخیرہ، DB، API) کے درمیان ایک مرکزی مقام رکھتا ہے۔ View ViewModel (LiveData, StateFlow) کے رد عمل ڈیٹا کو سبسکرائب کرتا ہے اور ان کے تبدیل ہونے پر خود بخود اپ ڈیٹ ہو جاتا ہے۔ ViewModel کو View کے وجود کا علم نہیں ہے — یہ صرف ڈیٹا اور کمانڈز فراہم کرتا ہے، اور View فیصلہ کرتا ہے کہ انہیں کیسے دکھانا ہے۔

MVP اور MVVM کا موازنہ: MVP میں، پریزینٹر براہ راست View (انٹرفیس) کے طریقوں کو کال کرتا ہے، سخت تعلق پیدا کرتا ہے۔ MVVM میں، ViewModel رد عمل ڈیٹا سٹریم شائع کرتا ہے اور View انہیں سبسکرائب کرتا ہے — کنکشن یک طرفہ اور قابل آزمائش ہے۔ JetBrains Developer Survey (2024) کے مطابق، 68% Android ڈویلپر MVVM کو اپنے بنیادی فن تعمیر کے طور پر استعمال کرتے ہیں، اور ViewModel اس پیٹرن کا ایک اہم جزو ہے۔

IT Sectr میں، ہم 2018 سے تمام تجارتی Kotlin منصوبوں میں ViewModel کے ساتھ MVVM استعمال کر رہے ہیں۔ مشق سے پتہ چلتا ہے کہ یہ طریقہ ذمہ داریوں کی واضح علیحدگی اور ایمولیٹر کے بغیر کاروباری منطق کی جانچ پڑتال کی صلاحیت کی وجہ سے UI منطق کی ڈیبگنگ وقت کو 30–40% کم کرتا ہے۔

ViewModelProvider اور فیکٹریاں: پیرامیٹرز کے ساتھ تخلیق

ViewModelProvider fragment یا Activity میں ViewModel حاصل کرنے کا معیاری طریقہ ہے۔ ڈیفالٹ طور پر، ViewModelProvider خالی کنسٹرکٹر (بغیر آرگومینٹس) کے ذریعے ViewModel بناتا ہے۔ اگر ViewModel کو پیرامیٹرز کی ضرورت ہو (مثلاً، ذخیرہ یا ایپلیکیشن سیاق)، تو ViewModelProvider.Factory کو لاگو کرنا ضروری ہے۔

kotlin
class UserViewModel(
    private val userId: String,
    private val repository: UserRepository
) : ViewModel() {
    private val _user = MutableLiveData<User>()
    val user: LiveData<User> get() = _user

    fun loadUser() {
        viewModelScope.launch {
            _user.value = repository.getUser(userId)
        }
    }
}

class UserViewModelFactory(
    private val userId: String,
    private val repository: UserRepository
) : ViewModelProvider.Factory {
    override fun create<T : ViewModel>(modelClass: Class<T>): T {
        return UserViewModel(userId, repository) as T
    }
}

Fragment یا Activity سے ViewModel حاصل کرتے وقت فیکٹری ViewModelProvider کو دی جاتی ہے۔ SavedStateHandle AndroidX 1.2.0 میں متعارف کرایا گیا ایک متبادل پیرامیٹر منتقلی کا طریقہ کار ہے: ViewModel خود بخود کنسٹرکٹر کے ذریعے SavedStateHandle وصول کرتا ہے، اور آرگومینٹس کسٹم فیکٹری لکھے بغیر Bundle کے ذریعے منتقل کیے جاتے ہیں۔

ViewModel میں viewModelScope اور کوروٹینز

viewModelScope ViewModel میں بلٹ ان اور اس کی زندگی کے دور سے منسلک CoroutineScope ہے۔ viewModelScope میں شروع کی گئی تمام کوروٹینز onCleared() کال ہونے پر خود بخود منسوخ ہو جاتی ہیں، جو ViewModel کی تباہی کے بعد میموری رساو اور پس منظر کی کارروائیوں کو روکتی ہیں۔

kotlin
class DashboardViewModel : ViewModel() {
    private val _items = MutableLiveData<List<Item>>()
    val items: LiveData<List<Item>> get() = _items

    fun loadDashboard() {
        viewModelScope.launch(Dispatchers.IO) {
            val result = repository.fetchDashboard()
            withContext(Dispatchers.Main) {
                _items.value = result
            }
        }
    }

    override fun onCleared() {
        super.onCleared()
        // تمام viewModelScope کوروٹینز خود بخود منسوخ ہو جاتی ہیں
    }
}

viewModelScope میں کوروٹینز ڈیفالٹ طور پر Dispatchers.Main پر چلتی ہیں۔ نیٹ ورک یا ڈسک کارروائیوں کے لیے، withContext کا استعمال کرتے ہوئے Dispatchers.IO پر جائیں یا launch میں ڈسپیچر متعین کریں۔ Google (Android Dev Summit 2024) کے مطابق، viewModelScope کا استعمال دستی Job انتظام کے مقابلے میں کوروٹین سے متعلق میموری رساو کو 95% کم کرتا ہے۔

Hilt اور Koin کے ساتھ ViewModel: DI طریقے

Hilt Dagger پر بنایا گیا Android کے لیے Google کی سرکاری انحصاری انجیکشن لائبریری ہے۔ Hilt کے ساتھ، ViewModelProvider.Factory کو دستی طور پر لکھنے کی ضرورت نہیں ہے — بس ViewModel کنسٹرکٹر کو @HiltViewModel سے نوٹ کریں۔ Hilt خود بخود فیکٹری بناتا ہے اور کنسٹرکٹر میں اعلان کردہ انحصاریوں کو انجیکٹ کرتا ہے۔

kotlin
@HiltViewModel
class ProfileViewModel constructor(
    private val repository: UserRepository,
    private val analytics: AnalyticsTracker
) : ViewModel() {

    private val _profile = MutableStateFlow<ProfileState>(ProfileState.Loading)
    val profile: StateFlow<ProfileState> get() = _profile

    fun loadProfile(userId: String) {
        viewModelScope.launch {
            _profile.value = ProfileState.Success(repository.getUser(userId))
            analytics.logEvent("profile_loaded")
        }
    }
}

// Fragment میں — فیکٹری کے بغیر:
val viewModel: ProfileViewModel = by viewModels()

Koin کوڈ جنریشن کے بغیر ایک متبادل DI لائبریری ہے۔ Koin میں، ViewModel viewModel { } کے ذریعے ماڈیول میں اعلان کیا جاتا ہے، اور fragment میں by viewModel() کے ذریعے حاصل کیا جاتا ہے۔ Hilt اور Koin کے درمیان انتخاب منصوبے پر منحصر ہے: Hilt مرتب وقت پر انحصاری گراف کی تصدیق فراہم کرتا ہے، Koin ہلکا ہے اور kapt/ksp کی ضرورت نہیں ہے۔ IT Sectr میں، ہم بڑے منصوبوں (50 سے زیادہ اسکرین) میں Hilt اور درمیانے منصوبوں میں Koin استعمال کرتے ہیں۔

کوڈ مثالیں: Kotlin میں ViewModel

مثال 1: کاؤنٹر کے ساتھ بنیادی ViewModel

ایک سادہ ViewModel جو ایک عددی کاؤنٹر ذخیرہ کرتا ہے جو اسکرین گھومنے پر دوبارہ سیٹ نہیں ہوتا۔ MutableLiveData اور LiveData کے استعمال کا بنیادی پیٹرن دکھاتا ہے۔

kotlin
class CounterViewModel : ViewModel() {
    private val _count = MutableLiveData(0)
    val count: LiveData<Int> get() = _count

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

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

مثال 2: SavedStateHandle کے ساتھ ViewModel

ViewModel جو نظام کے ذریعے عمل ختم ہونے پر بھی خود بخود حالت محفوظ رکھنے کے لیے SavedStateHandle استعمال کرتا ہے۔ SavedStateHandle واحد طریقہ کار ہے جو ایپ کو پس منظر میں چھوٹا کرنے اور ختم کرنے پر ڈیٹا محفوظ کرتا ہے۔

kotlin
class FormViewModel(
    private val savedStateHandle: SavedStateHandle
) : ViewModel() {

    val userName = savedStateHandle.getLiveData<String>("userName", "")
    val email = savedStateHandle.getLiveData<String>("email", "")

    fun saveName(name: String) {
        savedStateHandle["userName"] = name
    }

    fun saveEmail(email: String) {
        savedStateHandle["email"] = email
    }
}

SavedStateHandle سے LiveData خود بخود آخری قدر Bundle میں محفوظ کرتا ہے۔ عمل کی دوبارہ تخلیق پر (مثلاً، ایپ کو چھوٹا کرنے اور بند کرنے کے بعد)، Bundle بحال ہو جاتا ہے اور LiveData پچھلی قدر وصول کرتا ہے۔ Google کے ٹیسٹوں کے مطابق، SavedStateHandle Bundle میں 5 KB تک ڈیٹا محفوظ کرنے کی ضمانت دیتا ہے — ٹیکسٹ فیلڈز، IDs اور ترتیب شدہ JSON اشیاء کے لیے کافی۔

اکثر پوچھے گئے سوالات

ViewModel onSaveInstanceState سے کیسے مختلف ہے؟

ViewModel عمل کی RAM میں ڈیٹا ذخیرہ کرتا ہے — یہ ترتیب سازی کے بغیر فوری طور پر دستیاب ہے، پیچیدہ اشیاء (فہرستیں، Bitmap، نیٹ ورک جوابات) کے لیے موزوں۔ onSaveInstanceState() ڈیٹا کو Bundle میں ترتیب دیتا ہے (Android 12 سے شروع ہر لین دین کے لیے زیادہ سے زیادہ 1 MB) اور صرف سادہ قدیم اقسام، String اور Serializable/Parcelable کے لیے موزوں ہے۔ ViewModel + SavedStateHandle Google کا تجویز کردہ امتزاج ہے: رن ٹائم ڈیٹا کے لیے ViewModel، عمل ختم ہونے پر بحالی کے لیے SavedStateHandle۔

کیا مجھے ViewModel کو دستی طور پر صاف کرنے کی ضرورت ہے؟

نہیں، نظام خود بخود دائرہ کار ختم ہونے پر onCleared() کال کرتا ہے۔ viewModelStore.clear() کے ذریعے دستی صفائی صرف ٹیسٹ کے معاملات کے درمیان رساو کو روکنے کے لیے ٹیسٹوں میں ضروری ہے۔ پروڈکشن کوڈ میں، کبھی بھی دستی طور پر clear() کال نہ کریں — یہ ViewModel کی زندگی کے دور کو توڑتا ہے اور غیر متوقع UI رویے کا سبب بن سکتا ہے۔

کیا Compose میں ViewModel استعمال کیا جا سکتا ہے؟

ہاں، ViewModel Jetpack Compose میں viewModel() فنکشن کے ذریعے مکمل طور پر تعاون یافتہ ہے۔ Compose میں، ViewModel Composable دائرہ کار کی سطح پر حاصل کیا جاتا ہے اور دائرہ کار سے باہر نکلنے پر خود بخود صاف ہو جاتا ہے۔ MVVM کے Compose ورژن کو یک طرفہ ڈیٹا بہاو (UDF) کہا جاتا ہے: ViewModel StateFlow شائع کرتا ہے، اور Composable فنکشنز collectAsState() کے ذریعے سبسکرائب کرتے ہیں۔ کم کرنے والے طریقہ کا Compose ورژن ViewModel کے ساتھ MVI ہے۔

ViewModel میں کیا ذخیرہ نہیں کرنا چاہیے؟

Activity، Fragment، View، Context (Application کے علاوہ) کے حوالے ذخیرہ کرنا منع ہے۔ اس سے میموری رساو ہوتا ہے کیونکہ ViewModel UI سیاق سے زیادہ زندہ رہتا ہے۔ ترتیب شدہ View حالتیں (مثلاً RecyclerView پوزیشن) ذخیرہ نہ کریں — LayoutManager.onSaveInstanceState() استعمال کریں۔ ڈیٹا کی بڑی مقدار (10 MB سے زیادہ) ذخیرہ کرنے سے گریز کریں — عمل چھوٹا کرنے پر، SavedStateHandle کے بغیر ڈیٹا ضائع ہو جائے گا۔

ViewModel کیسے جانچیں؟

ViewModel ایمولیٹر کے بغیر عام Kotlin کلاس کی طرح جانچا جاتا ہے: مثال بنائیں، طریقے کال کریں، LiveData یا StateFlow کی حالت چیک کریں۔ کوروٹینز کی جانچ کے لیے، TestDispatcher کے ساتھ kotlinx-coroutines-test سے runTest استعمال کریں۔ Hilt کے ساتھ ViewModel کے لیے، جانچ fragment میں @HiltViewModelTest اور hiltViewModel() استعمال کریں۔ Google کے مطابق، یونٹ ٹیسٹ آلہ کار ٹیسٹ کے بغیر ViewModel منطق کا 80–90% احاطہ کرتے ہیں۔

خلاصہ

  • ViewModel — UI ڈیٹا ذخیرہ کرنے کے لیے Jetpack جزو، حالت کھونے کے بغیر ترتیباتی تبدیلیوں سے بچ جاتا ہے۔
  • ViewModel کی زندگی کا دور Activity مثال کے بجائے دائرہ کار (Activity/Fragment) سے منسلک ہے — صفائی دائرہ کار ختم ہونے پر ہوتی ہے۔
  • ViewModelProvider — ViewModel بنانے کے لیے فیکٹری طریقہ؛ پیرامیٹرز کے لیے ViewModelProvider.Factory لاگو کریں۔
  • viewModelScope — ایک بلٹ ان CoroutineScope جو onCleared() پر کوروٹینز کو خود بخود منسوخ کرتا ہے، میموری رساو کو ختم کرتا ہے۔
  • SavedStateHandle — عمل ختم ہونے پر حالت کے تحفظ کا طریقہ کار، ViewModel کنسٹرکٹر میں ضم۔
  • Hilt اور @HiltViewModel — بڑے منصوبوں میں ViewModel کے لیے DI کا معیاری طریقہ؛ Koin — کوڈ جنریشن کے بغیر ہلکا متبادل۔
  • ViewModel MVVM اور UDF فن تعمیرات کی بنیاد ہے، Google I/O 2025 کے مطابق 82% Jetpack ایپس میں استعمال ہوتا ہے۔

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں