State Hoisting: حالت بلند کرنا اور Compose میں یک طرفہ ڈیٹا بہاؤ

مصنف: IT Sectr اشاعت: 2026-06-28 مطالعے کا وقت: 8 منٹ

State Hoisting Jetpack Compose میں ایک پیٹرن ہے جس میں حالت کو چائلڈ Composable فنکشن سے پیرنٹ میں منتقل کیا جاتا ہے، اور چائلڈ پیرامیٹرز کے ذریعے ڈیٹا حاصل کرتا ہے اور کال بیک کے ذریعے تبدیلیوں کی اطلاع دیتا ہے۔ یہ یک طرفہ ڈیٹا بہاؤ (UDF) کے اصول کا نفاذ ہے، جس میں حالت اوپر اٹھتی ہے اور واقعات نیچے آتے ہیں۔ Google Android Developers, 2026 کے مطابق، State Hoisting اجزاء کو دوبارہ قابل استعمال، قابل جانچ اور پیش قیاسی بناتا ہے۔

اہم نکات

  • State Hoisting حالت کو چائلڈ جزو سے پیرنٹ میں منتقل کرتا ہے
  • UDF (یک طرفہ ڈیٹا بہاؤ) — حالت نیچے بہتی ہے، واقعات اوپر
  • پیرامیٹرز چائلڈ جزو کے: قدر (T) + لیمبڈا (T) -> Unit
  • دوبارہ استعمال — بلند کردہ حالت مختلف ڈیٹا ذرائع کے ساتھ ایک ہی فنکشن استعمال کرنے دیتی ہے
  • جانچ — State Hoisting منطق کو UI سے الگ کرکے یونٹ ٹیسٹ کو آسان بناتا ہے

Jetpack Compose میں State Hoisting کیا ہے

State Hoisting ایک پیٹرن ہے جس میں Composable فنکشن حالت کا مالک نہیں ہوتا بلکہ اسے باہر سے حاصل کرتا ہے۔ فنکشن کے اندر var کے بجائے دو پیرامیٹر استعمال کیے جاتے ہیں: ڈسپلے کے لیے ایک قدر اور تبدیلیوں کو سنبھالنے کے لیے ایک لیمبڈا کال بیک۔ تکنیکی طور پر، اس کا مطلب ہے کہ چائلڈ جزو بے حالت (stateless) ہو جاتا ہے، جبکہ پیرنٹ حالت دار (stateful) ہوتا ہے۔

مثال: Material3 کا TextField جزو داخلی طور پر درج کردہ متن کو ذخیرہ نہیں کرتا۔ یہ value: String اور onValueChange: (String) -> Unit قبول کرتا ہے۔ TextField کو کال کرنے والا پیرنٹ var value by remember { mutableStateOf("") } اعلان کرتا ہے اور value اور onValueChange منتقل کرتا ہے۔ یہ کلاسک State Hoisting ہے: TextField ایک سادہ جزو ہے (صرف ڈسپلے کرتا ہے اور ان پٹ کی اطلاع دیتا ہے)، پیرنٹ ذہین ہے (حالت کا مالک)۔

بے حالت بمقابلہ حالت دار: بے حالت جزو جانچنا آسان ہے — یہ اندرونی حالت پر منحصر نہیں، اس کا رویہ مکمل طور پر ان پٹ پیرامیٹرز سے طے ہوتا ہے۔ حالت دار جزو تیز پروٹوٹائپنگ کے لیے آسان ہے لیکن دوبارہ استعمال مشکل ہے: یہ ایک ڈیٹا ماخذ سے مضبوطی سے منسلک ہوتا ہے۔ State Hoisting آپ کو انتخاب دیتا ہے: حالت کو اوپر لے جا کر کسی بھی جزو کو بے حالت بنایا جا سکتا ہے۔

یک طرفہ ڈیٹا بہاؤ (UDF) اور State Hoisting

UDF (یک طرفہ ڈیٹا بہاؤ) ایک آرکیٹیکچرل اصول ہے جہاں ڈیٹا ایک سمت میں چلتا ہے: سچائی کے ماخذ (ViewModel یا پیرنٹ Composable) سے UI تک، اور واقعات مخالف سمت میں بہتے ہیں۔ State Hoisting انفرادی جزو کی سطح پر UDF کا نفاذ ہے۔ ہر جزو کے اپنی حالت کو کب اور کیسے تبدیل کرنے کا فیصلہ کرنے کے بجائے، یہ پیرنٹ کو کسی واقعہ کے بارے میں مطلع کرتا ہے، اور پیرنٹ فیصلہ کرتا ہے کہ حالت کو کیسے تبدیل کرنا ہے۔

UDF کے فوائد: پیش قیاسی — حالت صرف ایک جگہ تبدیل ہوتی ہے، مسابقت کی صورتوں کو ختم کرتی ہے؛ ٹریس ایبلٹی — کال اسٹیک تبدیلیوں کی زنجیر کو دوبارہ تشکیل دینے دیتا ہے؛ جانچ — حالت دار منطق کو علیحدہ کلاس میں نکالا جا سکتا ہے اور UI کے بغیر جانچا جا سکتا ہے۔ بڑے منصوبوں میں، State Hoisting کے ساتھ UDF حقیقی معیار ہے۔

سچائی کا واحد ماخذ (Single Source of Truth) ایک اور اصول ہے جو UDF کے ساتھ آتا ہے۔ حالت کے ہر ٹکڑے کا بالکل ایک ماخذ ہوتا ہے۔ اگر دو جزو ایک ہی حالت استعمال کرتے ہیں، تو ماخذ مشترکہ ہونا چاہیے (ViewModel یا مشترکہ پیرنٹ سطح پر)۔ State Hoisting یقینی بناتا ہے کہ ماخذ درجہ بندی میں اوپر ہے اور حالت کا تکرار نہیں ہوتا۔

سمتکیا منتقل کیا جاتا ہےکیسے نافذ کیا جاتا ہے
نیچے (پیرنٹ → چائلڈ)ڈسپلے کرنے کی قدرپیرامیٹر value: T
اوپر (چائلڈ → پیرنٹ)تبدیلی کا واقعہپیرامیٹر onValueChange: (T) -> Unit

State Hoisting کے قواعد: کب اور کیسے حالت بلند کریں

بنیادی اصول: حالت کو کم سے کم ممکنہ سطح تک بلند کیا جانا چاہیے جو تمام اجزاء کے لیے کافی ہو جنہیں اس کی ضرورت ہے۔ اگر حالت صرف ایک جزو کے اندر استعمال ہوتی ہے — اسے مقامی رکھیں۔ اگر دو ملحقہ اجزاء کو ایک ہی حالت کی ضرورت ہے — اسے مشترکہ پیرنٹ تک بلند کریں۔ اگر حالت پوری اسکرین پر ضروری ہے — اسے ViewModel تک بلند کریں۔

کم سے کم بلندی کا اصول غیر ضروری پیچیدگی کو روکتا ہے۔ ٹیکسٹ فیلڈ کی حالت کو ViewModel میں بلند کرنے کا کوئی فائدہ نہیں اگر یہ صرف ایک اسکرین کے اندر استعمال ہوتی ہے اور Activity کی دوبارہ تخلیق پر محفوظ نہیں ہوتی۔ اسکرین پیرنٹ سطح پر rememberSaveable استعمال کریں، ViewModel میں نہیں، UI حالت کے لیے جو اسکرین گردش سے بچنی چاہیے لیکن کاروباری منطق کو اس کی ضرورت نہیں۔

ViewModel میں کب بلند کریں: اگر حالت کو Activity کی دوبارہ تخلیق پر باقی رہنا ہے، اگر متعدد اسکرینوں کو اس کی ضرورت ہے، اگر حالت کی تبدیلی کاروباری منطق (نیٹ ورک درخواستیں، ڈیٹا بیس) کو متحرک کرتی ہے۔ ViewModel سطح پر State Hoisting MVVM آرکیٹیکچر میں ایک معیاری پیٹرن ہے، جہاں UI پرت بے حالت اور ViewModel حالت دار ہے۔

kotlin
    // ❌ برا: جزو اپنی حالت کا مالک ہے
@Composable
fun BadTextField(label: String) {
    var text by remember { mutableStateOf("") }
    TextField(value = text, onValueChange = { text = it }, label = { Text(label) })
}

    // ✅ اچھا: State Hoisting — حالت پیرنٹ میں
@Composable
fun GoodTextField(value: String, onValueChange: (String) -> Unit, label: String) {
    TextField(value = value, onValueChange = onValueChange, label = { Text(label) })
}

    // استعمال: پیرنٹ حالت کا مالک ہے
@Composable
fun Form() {
    var name by rememberSaveable { mutableStateOf("") }
    GoodTextField(value = name, onValueChange = { name = it }, label = "Name")
}

حقیقی اجزاء میں State Hoisting کی مثالیں

دو فیلڈز (ای میل، پاس ورڈ) اور ایک بٹن والی لاگ ان اسکرین پر غور کریں۔ تینوں اجزاء State Hoisting کے ذریعے حالت حاصل کرتے ہیں: ای میل اور پاس ورڈ پیرنٹ کے زیر انتظام ہیں، بٹن اپنی فعال حالت ایک قدر کے طور پر حاصل کرتا ہے۔

kotlin
    // اسکرین سطح پر State Hoisting
@Composable
fun LoginScreen(viewModel: LoginViewModel) {
    val uiState by viewModel.uiState.collectAsState()

    Column(modifier = Modifier.padding(16.dp)) {
        // ای میل فیلڈ — لیمبڈا کے ذریعے State Hoisting
        EmailField(
            email = uiState.email,
            onEmailChange = { viewModel.onEmailChanged(it) }
        )

        // پاس ورڈ فیلڈ — اسی طرح
        PasswordField(
            password = uiState.password,
            onPasswordChange = { viewModel.onPasswordChanged(it) }
        )

        // بٹن — صرف enabled حاصل کرتا ہے (صرف پڑھنے کے لیے)
        LoginButton(enabled = uiState.isFormValid, onClick = viewModel::login)
    }
}

// بے حالت جزو: ای میل + کال بیک حاصل کرتا ہے
@Composable
fun EmailField(email: String, onEmailChange: (String) -> Unit) {
    OutlinedTextField(
        value = email,
        onValueChange = onEmailChange,
        label = { Text("ای میل") },
        singleLine = true
    )
}

// بے حالت بٹن جزو
@Composable
fun LoginButton(enabled: Boolean, onClick: () -> Unit) {
    Button(onClick = onClick, enabled = enabled) {
        Text("لاگ ان")
    }
}

EmailField اور PasswordField مکمل طور پر بے حالت ہیں۔ انہیں کسی بھی ڈیٹا ماخذ سے منسلک کرکے کسی بھی اسکرین پر دوبارہ استعمال کیا جا سکتا ہے۔ LoginButton enabled کو صرف پڑھنے کے لیے حاصل کرتا ہے — یہ State Hoisting کی ایک اور شکل ہے جہاں حالت بلند نہیں ہوتی (بٹن خود کو فعال نہیں کر سکتا) بلکہ تیار شدہ نیچے بھیجی جاتی ہے۔ یہ نقطہ نظر کم سے کم جزو وابستگی کے ساتھ زیادہ سے زیادہ لچک فراہم کرتا ہے۔

State Hoisting بمقابلہ مقامی حالت: انتخاب کا معیار

ہر حالت کو بلند کرنے کی ضرورت نہیں۔ مقامی حالت (Composable کے اندر State) اس وقت جائز ہے جب: ڈیٹا صرف ایک جزو کے اندر ضروری ہو، پڑوسی عناصر کو متاثر نہ کرے، اور کسی مخصوص حصے کی دوبارہ تشکیل سے بچنے کی ضرورت نہ ہو۔ مثال کے طور پر، اینی میشن حالت، ان پٹ فیلڈ فوکس، موجودہ اسکرول پوزیشن — انہیں مقامی رکھنا معقول ہے۔

State Hoisting کب ضروری ہے: حالت متعدد چائلڈ اجزاء کے ذریعے استعمال ہوتی ہے؛ ایک چائلڈ میں تبدیلی دوسرے میں ظاہر ہونی چاہیے؛ حالت کی تبدیلیوں کی منطق کو UI سے الگ جانچنا ضروری ہے؛ حالت کو Activity کی دوبارہ تخلیق پر باقی رہنا چاہیے۔ ان صورتوں میں، مقامی حالت ڈیٹا کا تکرار اور عدم مطابقت پیدا کرتی ہے۔

مخلوط نقطہ نظر: کم سے کم حالت مقامی رکھیں، باقی بلند کریں۔ Compose کا اصول: “حالت کو جتنا ضروری ہو اتنا اوپر اور جتنا ممکن ہو اتنا نیچے بلند کریں۔” عملی طور پر، اس کا مطلب مقامی remember سے شروع کرنا اور صرف اس وقت سطح بلند کرنا جب کسی دوسرے جزو سے رسائی کی ضرورت ہو۔ State Hoisting کو پیشگی طور پر لاگو نہ کریں — یہ بغیر ضرورت کے کوڈ کو پیچیدہ بناتا ہے۔

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

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

State Hoisting ایک UI جزو سطح کا پیٹرن ہے۔ ViewModel کاروباری منطق کے لیے ایک آرکیٹیکچرل پرت ہے۔ State Hoisting حالت کو پیرنٹ Composable سطح، اسکرین سطح یا ViewModel تک بلند کر سکتا ہے۔ ViewModel اس حالت کے لیے بلند ترین نقطہ ہے جسے Activity کی دوبارہ تخلیق پر باقی رہنا ہے۔

State Hoisting والے جزو کو کیسے جانچیں؟

بے حالت جزو کو صرف قدریں منتقل کرکے جانچا جاتا ہے۔ مطلوبہ پیرامیٹرز کے ساتھ Composable کو کال کریں اور ComposeTestRule کے ذریعے ڈسپلے کی تصدیق کریں۔ حالت کی تبدیلیاں پیرنٹ یا ViewModel سطح پر جانچی جاتی ہیں — UI سے الگ۔ یہ جانچ کو نمایاں طور پر آسان بناتا ہے: جزو کے اندر دوبارہ تشکیل کی نقل کرنے کی ضرورت نہیں۔

کیا حالت صرف پڑھنے کے لیے بلند کی جا سکتی ہے؟

ہاں، یہ عام رواج ہے۔ اگر کسی جزو کو صرف ڈیٹا ڈسپلے کرنے کی ضرورت ہو اسے تبدیل کرنے کی صلاحیت کے بغیر — State<T> (صرف پڑھنے کے لیے) منتقل کریں۔ جزو تبدیلیوں کو سبسکرائب کرے گا لیکن انہیں شروع نہیں کر سکے گا۔ یہ انکیپسولیشن کو مضبوط کرتا ہے اور ڈیٹا کو ناپسندیدہ تغیرات سے بچاتا ہے۔

اگر حالت کو 3+ سطح گہرا بلند کرنے کی ضرورت ہو تو کیا کریں؟

گہرے منتقلی کے لیے CompositionLocal استعمال کریں یا پیرنٹ Composable پیرامیٹرز کے ذریعے منتقل کریں۔ اگر حالت پوری اسکرین پر ضروری ہو — اسے ViewModel میں نکالیں اور collectAsState() استعمال کریں۔ 5+ سطحوں کے ذریعے منتقلی غلط آرکیٹیکچر کی علامت ہے؛ جزو کے درجہ بندی پر نظر ثانی کریں۔

کیا State Hoisting کارکردگی کو متاثر کرتا ہے؟

State Hoisting دوبارہ تشکیل کی تعداد کو تھوڑا بڑھا سکتا ہے کیونکہ پیرنٹ میں تبدیلی تمام چائلڈ کو دوبارہ تشکیل دے سکتی ہے۔ تبدیلیوں کو فلٹر کرنے کے لیے derivedStateOf اور ہدفی اپ ڈیٹس کے لیے LazyColumn میں keys استعمال کریں۔ زیادہ تر منظرناموں میں، State Hoisting کا اضافی بوجھ برقرار رکھنے کی اہلیت کے فائدے کے مقابلے میں نہ ہونے کے برابر ہے۔

خلاصہ

  • State Hoisting حالت کو پیرنٹ جزو میں منتقل کرتا ہے، چائلڈ کو بے حالت بناتا ہے
  • UDF یک طرفہ ڈیٹا بہاؤ کو یقینی بناتا ہے: حالت نیچے، واقعات اوپر
  • دوبارہ استعمال — بے حالت اجزاء کسی بھی ڈیٹا ماخذ سے منسلک کیے جا سکتے ہیں
  • جانچ — UI ٹیسٹ صرف ڈسپلے کی تصدیق کرتے ہیں، منطق علیحدہ جانچی جاتی ہے
  • کم سے کم بلندی — صرف ضرورت کے مطابق بلند کریں
  • ViewModel — کاروباری منطق والی حالت کے لیے بلند ترین نقطہ
  • سفارش: مقامی remember سے شروع کریں، صرف ضرورت پڑنے پر بلند کریں

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

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

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

مزید پڑھیں