জীবনচক্র-সচেতন উপাদানগুলির সাথে কোটলিন কোরোটিনগুলি ব্যবহার করুন৷

কোটলিন কোরাউটিন একটি এপিআই প্রদান করে যা আপনাকে অ্যাসিঙ্ক্রোনাস কোড লিখতে দেয়। কোটলিন কোরাউটিনের সাহায্যে, আপনি একটি CoroutineScope নির্ধারণ করতে পারেন, যা আপনার কোরাউটিনগুলো কখন রান করবে তা পরিচালনা করতে সাহায্য করে। প্রতিটি অ্যাসিঙ্ক্রোনাস অপারেশন একটি নির্দিষ্ট স্কোপের মধ্যে চলে।

লাইফসাইকেল-অ্যাওয়ার কম্পোনেন্টগুলো আপনার অ্যাপের লজিক্যাল স্কোপের জন্য কো-রুটিনকে প্রথম শ্রেণীর সমর্থন প্রদান করে। এই ডকুমেন্টটিতে লাইফসাইকেল-অ্যাওয়ার কম্পোনেন্টের সাথে কীভাবে কার্যকরভাবে কো-রুটিন ব্যবহার করতে হয়, তা ব্যাখ্যা করা হয়েছে।

নির্ভরতা যোগ করুন

এই টপিকে বর্ণিত বিল্ট-ইন কো-রুটিন স্কোপগুলো লাইফসাইকেল এপিআই-এর অন্তর্ভুক্ত। এই স্কোপগুলো ব্যবহার করার সময় যথাযথ ডিপেন্ডেন্সিগুলো যোগ করতে ভুলবেন না।

  • Compose-এ ViewModel ইউটিলিটিগুলির জন্য, implementation("androidx.lifecycle:lifecycle-viewmodel-compose:$lifecycle_version") ব্যবহার করুন।
  • Compose-এ লাইফসাইকেল ইউটিলিটিগুলির জন্য, implementation("androidx.lifecycle:lifecycle-runtime-compose:$lifecycle_version") ব্যবহার করুন।

লাইফসাইকেল-সচেতন কোরাউটিন স্কোপ

Compose এবং Lifecycle লাইব্রেরিগুলো নিম্নলিখিত বিল্ট-ইন স্কোপগুলো প্রদান করে, যেগুলো আপনি আপনার অ্যাপে ব্যবহার করতে পারেন।

ভিউমডেলস্কোপ

আপনার অ্যাপের প্রতিটি ViewModel জন্য একটি ViewModelScope সংজ্ঞায়িত করা হয়। এই স্কোপে চালু করা যেকোনো কো-রুটিন স্বয়ংক্রিয়ভাবে বাতিল হয়ে যায় যদি ViewModel নিষ্ক্রিয় করা হয়। কো-রুটিন তখন কাজে আসে যখন এমন কোনো কাজ থাকে যা শুধুমাত্র ViewModel সক্রিয় থাকলেই সম্পন্ন করা প্রয়োজন। উদাহরণস্বরূপ, আপনি যদি কোনো লেআউটের জন্য ডেটা গণনা করেন, তবে কাজটি ViewModel মধ্যে সীমাবদ্ধ রাখা উচিত, যাতে ViewModel নিষ্ক্রিয় হয়ে গেলে কাজটি স্বয়ংক্রিয়ভাবে বাতিল হয়ে যায় এবং রিসোর্স খরচ এড়ানো যায়।

নিচের উদাহরণে দেখানো অনুযায়ী, আপনি ViewModel এর viewModelScope প্রপার্টির মাধ্যমে সেই ViewModel এর CoroutineScope অ্যাক্সেস করতে পারেন:

class MyViewModel: ViewModel() {
    init {
        viewModelScope.launch {
            // Coroutine that will be canceled when the ViewModel is cleared.
        }
    }
}

আরও উন্নত ব্যবহারের ক্ষেত্রে, আপনি ডিফল্ট viewModelScope প্রতিস্থাপন করতে সরাসরি ViewModel-এর কনস্ট্রাক্টরে একটি কাস্টম CoroutineScope পাস করতে পারেন। এই পদ্ধতিটি আরও বেশি নিয়ন্ত্রণ এবং নমনীয়তা প্রদান করে, বিশেষ করে নিম্নলিখিত ক্ষেত্রগুলিতে:

  • টেস্টিং: এটি আপনাকে একটি TestScope ইনজেক্ট করার সুযোগ দেয়, যার ফলে ইউনিট টেস্টে সময় নিয়ন্ত্রণ করা এবং কো-রুটিনের আচরণ যাচাই করা সহজ হয়।

  • কাস্টম কনফিগারেশন: ViewModel তার কাজ শুরু করার আগেই আপনি একটি নির্দিষ্ট CoroutineDispatcher (যেমন ভারী গণনার জন্য Dispatchers.Default ) অথবা একটি কাস্টম CoroutineExceptionHandler দিয়ে স্কোপটি কনফিগার করতে পারেন।

কম্পোজিশন-বাউন্ড স্কোপ

অ্যানিমেশন, নেটওয়ার্ক কল বা টাইমারের মতো সাইড ইফেক্টগুলোকে অবশ্যই কম্পোজেবলের লাইফসাইকেলের মধ্যে সীমাবদ্ধ রাখতে হবে। এর ফলে, যখন একটি কম্পোজেবল স্ক্রিন থেকে বেরিয়ে যায় (কম্পোজিশন থেকে প্রস্থান করে), তখন মেমরি লিক প্রতিরোধ করার জন্য চলমান যেকোনো কো-রুটিন স্বয়ংক্রিয়ভাবে বাতিল হয়ে যায়।

Compose, ডিক্লারেটিভভাবে কম্পোজিশন স্কোপিং পরিচালনা করার জন্য LaunchedEffect API প্রদান করে।

LaunchedEffect একটি CoroutineScope তৈরি করে যা আপনাকে সাসপেন্ড ফাংশন চালাতে দেয়। এই স্কোপটি হোস্ট অ্যাক্টিভিটির লাইফসাইকেলের সাথে নয়, বরং কম্পোজেবলের কম্পোজিশন লাইফসাইকেলের সাথে যুক্ত থাকে।

  • প্রবেশ: কম্পোজেবলটি কম্পোজিশনে প্রবেশ করলে কো-রুটিনটি শুরু হয়।
  • প্রস্থান: যখন কম্পোজেবলটি কম্পোজিশন থেকে বেরিয়ে যায়, তখন কো-রুটিনটি বাতিল হয়ে যায়।
  • পুনরায় চালু করা: LaunchedEffect এ পাস করা কোনো কী পরিবর্তিত হলে, বিদ্যমান কো-রুটিনটি বাতিল হয়ে যায় এবং একটি নতুন কো-রুটিন চালু হয়।

নিম্নলিখিত উদাহরণটি দেখায় কিভাবে LaunchedEffect ব্যবহার করে একটি স্পন্দনশীল অ্যানিমেশন তৈরি করা যায়। কো-রুটিনটি কম্পোজিশনে কম্পোজেবলটির উপস্থিতির সাথে যুক্ত থাকে এবং কনফিগারেশন পরিবর্তনের প্রতি প্রতিক্রিয়া দেখায়:

// Allow the pulse rate to be configured, so it can be sped up if the user is running
// out of time
var pulseRateMs by remember { mutableLongStateOf(3000L) }
val alpha = remember { Animatable(1f) }
LaunchedEffect(pulseRateMs) { // Restart the effect when the pulse rate changes
    while (isActive) {
        delay(pulseRateMs) // Pulse the alpha every pulseRateMs to alert the user
        alpha.animateTo(0f)
        alpha.animateTo(1f)
    }
}

LaunchedEffect সম্পর্কে আরও তথ্যের জন্য, Compose-এর Side-effects দেখুন।

জীবনচক্র-সচেতন প্রবাহ সংগ্রহ

Jetpack Compose-এ নিরাপদে ফ্লো সংগ্রহ করতে, collectAsStateWithLifecycle API ব্যবহার করুন। এই একটিমাত্র ফাংশন একটি Flow একটি Compose State অবজেক্টে রূপান্তর করে এবং আপনার জন্য স্বয়ংক্রিয়ভাবে লাইফসাইকেল সাবস্ক্রিপশন পরিচালনা করে। ডিফল্টরূপে, লাইফসাইকেল STARTED হলে সংগ্রহ শুরু হয় এবং লাইফসাইকেল STOPPED হলে সংগ্রহ বন্ধ হয়ে যায়। এই ডিফল্ট আচরণটি পরিবর্তন করতে, minActiveState প্যারামিটারে আপনার পছন্দের লাইফসাইকেল মেথডটি পাস করুন, যেমন Lifecycle.State.RESUMED

নিম্নলিখিত উদাহরণটি দেখায় কিভাবে একটি কম্পোজেবলে ViewModel-এর StateFlow সংগ্রহ করতে হয়:

@Composable
private fun ConversationScreen(
    conversationViewModel: ConversationViewModel = viewModel()
) {

    val messages by conversationViewModel.messages.collectAsStateWithLifecycle()

    ConversationScreen(
        messages = messages,
        onSendMessage = { message: Message -> conversationViewModel.sendMessage(message) }
    )
}

@Composable
private fun ConversationScreen(
    messages: List<Message>,
    onSendMessage: (Message) -> Unit
) {

    MessagesList(messages, onSendMessage)
    /* ... */
}

একাধিক প্রবাহের সমান্তরাল সংগ্রহ

Compose-এ, আপনি একাধিক স্টেট ভেরিয়েবল ঘোষণা করে সমান্তরালভাবে একাধিক ফ্লো সংগ্রহ করতে পারেন। যেহেতু collectAsStateWithLifecycle তার নিজস্ব অন্তর্নিহিত স্কোপ পরিচালনা করে, তাই সমান্তরাল সংগ্রহ স্বয়ংক্রিয়ভাবে সম্পন্ন হয়:

@Composable
fun DashboardScreen(viewModel: DashboardViewModel = viewModel()) {
    // Both flows are collected safely in parallel and will emit updates when either changes, the composables will recompose
    val userData by viewModel.userFlow.collectAsStateWithLifecycle()
    val feedData by viewModel.feedFlow.collectAsStateWithLifecycle()

    // ...
}

ফ্লো ব্যবহার করে অ্যাসিঙ্ক্রোনাসভাবে মান গণনা করুন

যখন অ্যাসিঙ্ক্রোনাসভাবে মান গণনা করার প্রয়োজন হয়, তখন stateIn অপারেটরের সাথে StateFlow ব্যবহার করুন।

নিম্নলিখিত কোড স্নিপেটটি একটি স্ট্যান্ডার্ড Flow StateFlow তে রূপান্তর করে ব্যবহার করে। কনফিগারেশন পরিবর্তনগুলি পরিচালনা করার জন্য, WhileSubscribed(5000) প্যারামিটারটি UI অদৃশ্য হয়ে যাওয়ার পরেও সাবস্ক্রিপশনটিকে পাঁচ সেকেন্ডের জন্য সক্রিয় রাখে।

val uiState: StateFlow<Result> = flow {
    emit(repository.fetchData())
}
.stateIn(
    scope = viewModelScope,
    started = SharingStarted.WhileSubscribed(5_000),
    initialValue = Result.Loading
)

সংগৃহীত মানগুলিকে Compose State এ রূপান্তর করতে collectAsStateWithLifecycle ব্যবহার করুন, যাতে ডেটা পরিবর্তিত হলেই আপনার UI স্বয়ংক্রিয়ভাবে আপডেট হতে পারে।

স্টেট সম্পর্কে আরও তথ্যের জন্য, স্টেট এবং জেটপ্যাক কম্পোজ দেখুন।

অতিরিক্ত সম্পদ

বিষয়বস্তু দেখুন

নমুনা

{% হুবহু %} {% endverbatim %} {% হুবহু %} {% endverbatim %}