Jetpack Compose-এর Side Effects

 

🌀 Jetpack Compose-এর Side Effects: মগজ-বন্ধু ব্যাখ্যা (Brain-Friendly) 🚀

Jetpack Compose declarative UI ফ্রেমওয়ার্ক, যার মানে হলো UI যখন দরকার তখনই পুনরায় আঁকা (Recompose) করা হয়। কিন্তু সবসময় UI-তে পরিবর্তন আসতে পারে না, কিছু কাজ UI-এর বাইরে করতে হয়, যেমন:

Coroutine চালানো (যেমন API Call বা Delay করা)
Animation শুরু করা
MediaPlayer চালানো ও বন্ধ করা
Back Press বা Configuration Change হ্যান্ডেল করা

এমন কাজগুলোকেই Side Effects বলা হয়, এবং Jetpack Compose-এ এগুলো করার জন্য কিছু নির্দিষ্ট API আছে।


🎯 ১. LaunchedEffect → Suspend Function বা Coroutine চালানোর জন্য

🧐 কবে লাগবে?
যখন UI প্রথমবার লোড হবে, তখন যদি কোন network request, database fetch, অথবা delay করা দরকার হয়, তাহলে LaunchedEffect ব্যবহার করা হয়।

🔹 ধরুন, আপনি একটা Counter Timer বানাতে চান, যা প্রতি ১ সেকেন্ডে আপডেট হবে

@Composable
fun TimerScreen() {
    var time by remember { mutableStateOf(0) }

    LaunchedEffect(Unit) { // Runs only once
        while (true) {
            delay(1000L)
            time++
        }
    }

    Text("⏳ Time: $time seconds")
}

Recomposition হলেও Coroutine নতুন করে শুরু হবে না!
Composable destroy হলে Coroutine ও বন্ধ হয়ে যাবে!


🎯 ২. rememberCoroutineScope → UI থেকে Coroutine চালানোর জন্য

🧐 কবে লাগবে?
যখন Button ক্লিক করলে Coroutine চালাতে হবে, কিন্তু LaunchedEffect দরকার নেই, তখন rememberCoroutineScope ব্যবহার করা হয়।

🔹 ধরুন, আপনি Login Button ক্লিক করলে API Call করবেন।

@Composable
fun LoginScreen() {
    val coroutineScope = rememberCoroutineScope()

    Button(onClick = {
        coroutineScope.launch {
            loginUser() // suspend function
        }
    }) {
        Text("🔑 Login")
    }
}

Button চাপলে Coroutine চলবে, কিন্তু Composable destroy হলে Task বন্ধ হবে না।
এই Coroutine চলতে থাকবে, ViewModel-এর মতো নয়!


🎯 ৩. SideEffect → যখন প্রতি Recomposition-এ কিছু করতে হয়

🧐 কবে লাগবে?
যখন Composable প্রতিবার Recompose হলে কিছু আপডেট করতে চান, তখন SideEffect ব্যবহার করা হয়।

🔹 ধরুন, আপনি প্রতি Recomposition-এ একটি লোগ লিখতে চান।

@Composable
fun MyComposable(count: Int) {
    SideEffect {
        Log.d("MyComposable", "Count updated: $count")
    }
    Text("Count: $count")
}

প্রতি Recomposition-এ লগ দেখাবে!


🎯 ৪. DisposableEffect → Clean-up করা প্রয়োজন হলে

🧐 কবে লাগবে?
যখন Composable destroy হলে কিছু বন্ধ করতে চান, যেমন MediaPlayer বা Sensor বন্ধ করা

🔹 ধরুন, আপনি একটি Music Player চালু করতে চান, এবং Composable Destroy হলে Player বন্ধ হবে।

@Composable
fun MediaPlayerScreen() {
    DisposableEffect(Unit) {
        val player = MediaPlayer()
        player.start() // 🎵 Start playing

        onDispose {
            player.release() // 🛑 Stop playing when Composable is removed
        }
    }
}

Composable destroy হলে onDispose রান হবে এবং মেমোরি লিক হবে না!


🎯 ৫. produceState → Suspend Function থেকে State তৈরি করা

🧐 কবে লাগবে?
যখন Coroutine থেকে UI-এর জন্য Data Fetch করতে হয়, তখন produceState ব্যবহার করা হয়।

🔹 ধরুন, আপনি API থেকে ব্যবহারকারীর নাম আনতে চান।

@Composable
fun UserNameScreen(userId: String) {
    val userName by produceState(initialValue = "Loading...", userId) {
        value = fetchUserName(userId) // suspend function
    }

    Text("👤 User: $userName")
}

Composable destroy হলে Coroutine বন্ধ হয়ে যাবে!


🎯 ৬. rememberUpdatedState → Callback-এর আপডেটেড মান রাখা

🧐 কবে লাগবে?
যখন Composable-এর মধ্যে Callback function আপডেট রাখতে হয়, তখন rememberUpdatedState ব্যবহার করা হয়।

🔹 ধরুন, আপনি একটি Timer বানিয়েছেন, যা প্রতি ১ সেকেন্ডে একটি Callback রান করবে।

@Composable
fun Timer(callback: () -> Unit) {
    val updatedCallback by rememberUpdatedState(callback)

    LaunchedEffect(Unit) {
        while (true) {
            delay(1000L)
            updatedCallback()
        }
    }
}

Composable Recompose হলেও Callback হারাবে না!


💡 সারসংক্ষেপ (Summary)

API কবে ব্যবহার করবেন?
LaunchedEffect Suspend function চালানোর জন্য
rememberCoroutineScope UI থেকে Coroutine চালানোর জন্য
SideEffect প্রতি Recomposition-এ কিছু করার জন্য
DisposableEffect Cleanup করার জন্য (e.g., MediaPlayer বন্ধ করা)
produceState Suspend function থেকে State তৈরি করতে
rememberUpdatedState Callback function আপডেট রাখতে

🚀 শেষ কথা

Jetpack Compose-এ Side Effects সঠিকভাবে ব্যাবহার করলে আপনার অ্যাপ হবে performant, lifecycle-aware, এবং memory-efficient! 🏆

LaunchedEffectCoroutine চালান (একবারই রান হবে)
rememberCoroutineScopeButton ক্লিক হলে Coroutine চালান
SideEffectপ্রতি Recomposition-এ কিছু করুন
DisposableEffectDestroy হলে Cleanup করুন
produceStateSuspend Function থেকে State তৈরি করুন
rememberUpdatedStateCallback-এর Updated মান রাখুন

এখন আপনি Jetpack Compose-এর Side Effects সম্পর্কে পুরোপুরি প্রস্তুত! 🚀🔥

Comments

Popular posts from this blog

AI (Artificial Intelligence) সহজভাবে বোঝার জন্য একদম মস্তিষ্ক-বান্ধব ব্যাখ্যা 🧠🤖

🧠 Regex কী?

Kotlin-এ ভেরিয়েবল ঘোষণা করার দুই উপায়