পণ্যের খবর

Jetpack Compose-এর ডিসেম্বর '২৫ সংস্করণে নতুন কী আছে

৬ মিনিটের পাঠ
Nick Butcher
পণ্য ব্যবস্থাপক

আজ, Jetpack Compose-এর ডিসেম্বর '২৫ রিলিজটি স্থিতিশীল হয়েছে। এতে রয়েছে কোর কম্পোজ মডিউলগুলোর ভার্সন ১.১০ এবং ম্যাটেরিয়াল ৩-এর ভার্সন ১.৪ (সম্পূর্ণ BOM ম্যাপিং দেখুন), যা নতুন ফিচার যোগ করেছে এবং পারফরম্যান্সে বড় ধরনের উন্নতি এনেছে।

আজকের রিলিজটি ব্যবহার করতে, আপনার Compose BOM ভার্সনটি 2025.12.00 -এ আপগ্রেড করুন:

implementation(platform("androidx.compose:compose-bom:2025.12.00"))

কর্মক্ষমতার উন্নতি

আমরা জানি যে আপনার অ্যাপের রানটাইম পারফরম্যান্স আপনার এবং আপনার ব্যবহারকারীদের জন্য অত্যন্ত গুরুত্বপূর্ণ, তাই পারফরম্যান্স কম্পোজ টিমের জন্য একটি প্রধান অগ্রাধিকার ছিল। এই রিলিজে বেশ কিছু উন্নতি আনা হয়েছে—এবং সর্বশেষ সংস্করণে আপগ্রেড করলেই আপনি এই সবগুলি পেয়ে যাবেন। আমাদের অভ্যন্তরীণ স্ক্রল বেঞ্চমার্ক দেখায় যে, কম্পোজ এখন ভিউস (Views) ব্যবহার করলে আপনি যে পারফরম্যান্স পেতেন, তার সমতুল্য পারফরম্যান্স প্রদান করে:

জ্যাঙ্কি.পিএনজি

কম্পোজের বিভিন্ন সংস্করণের মধ্যে ভিউস এবং জেটপ্যাক কম্পোজের স্ক্রোল পারফরম্যান্স বেঞ্চমার্ক তুলনা।

লেজি প্রিফেচে পজযোগ্য কম্পোজিশন

লেজি প্রিফেচ-এ পজযোগ্য কম্পোজিশন এখন ডিফল্টরূপে সক্রিয় করা হয়েছে। এটি কম্পোজ রানটাইম শিডিউলের কার্যপ্রণালীতে একটি মৌলিক পরিবর্তন, যা ভারী UI ওয়ার্কলোডের সময় জ্যাঙ্ক উল্লেখযোগ্যভাবে হ্রাস করার জন্য ডিজাইন করা হয়েছে।

পূর্বে, একবার কোনো কম্পোজিশন শুরু হলে, সেটিকে সম্পূর্ণ হতে হতো। কম্পোজিশনটি জটিল হলে, এটি একটি ফ্রেমের চেয়ে বেশি সময়ের জন্য মেইন থ্রেডকে ব্লক করে রাখতে পারত, যার ফলে UI ফ্রিজ হয়ে যেত। পজেবল কম্পোজিশনের মাধ্যমে, রানটাইম এখন সময় ফুরিয়ে এলে তার কাজ "পজ" করতে পারে এবং পরবর্তী ফ্রেমে কাজটি আবার শুরু করতে পারে। ফ্রেমগুলোকে আগে থেকে প্রস্তুত করার জন্য লেজি লেআউট প্রিফেচের সাথে ব্যবহার করলে এটি বিশেষভাবে কার্যকর হয়। Compose 1.9-এ প্রবর্তিত লেজি লেআউট CacheWindow API-গুলো আরও বেশি কন্টেন্ট প্রিফেচ করার এবং পজেবল কম্পোজিশনের সুবিধা নিয়ে অনেক বেশি মসৃণ UI পারফরম্যান্স তৈরি করার একটি দুর্দান্ত উপায়।

pausable.gif

Paadable composition এবং Lazy prefetch-এর সমন্বয় জ্যাঙ্ক কমাতে সাহায্য করে।

আমরা Modifier.onPlaced , Modifier.onVisibilityChanged এবং অন্যান্য মডিফায়ার ইমপ্লিমেন্টেশনের উন্নতির মাধ্যমে অন্যান্য ক্ষেত্রেও পারফরম্যান্স অপ্টিমাইজ করেছি। আমরা Compose-এর পারফরম্যান্স উন্নত করার জন্য বিনিয়োগ অব্যাহত রাখব।

নতুন বৈশিষ্ট্য

ধরে রাখুন

Compose বিভিন্ন লাইফসাইকেল জুড়ে স্টেট ধরে রাখতে এবং পরিচালনা করার জন্য বেশ কিছু API অফার করে; উদাহরণস্বরূপ, remember কম্পোজিশন জুড়ে স্টেট ধরে রাখে, এবং rememberSavable / rememberSerializable অ্যাক্টিভিটি বা প্রসেস পুনরায় চালু করার পরেও তা ধরে রাখে। retain হলো একটি নতুন API যা এই API-গুলোর মাঝামাঝি অবস্থানে রয়েছে, যা আপনাকে সিরিয়ালাইজ না করেই কনফিগারেশন পরিবর্তনের পরেও ভ্যালু ধরে রাখতে সক্ষম করে, কিন্তু প্রসেস বন্ধ হয়ে গেলে তা পারে না। যেহেতু retain আপনার স্টেটকে সিরিয়ালাইজ করে না, তাই আপনি ল্যাম্বডা এক্সপ্রেশন, ফ্লো এবং বিটম্যাপের মতো বড় অবজেক্টগুলো ধরে রাখতে পারেন, যেগুলো সহজে সিরিয়ালাইজ করা যায় না। উদাহরণস্বরূপ, আপনি একটি মিডিয়া প্লেয়ার (যেমন ExoPlayer) পরিচালনা করতে retain ব্যবহার করতে পারেন, যাতে কোনো কনফিগারেশন পরিবর্তনের কারণে মিডিয়া প্লেব্যাক বাধাগ্রস্ত না হয়।

@Composable

fun MediaPlayer() {

    val applicationContext = LocalContext.current.applicationContext

    val exoPlayer = retain { ExoPlayer.Builder(applicationContext).apply { ... }.build() }

    ...

}

আমরা AndroidDev কমিউনিটিকে (বিশেষ করে Circuit টিমকে) ধন্যবাদ জানাতে চাই, যারা এই ফিচারটির ডিজাইনে প্রভাব ফেলেছেন এবং অবদান রেখেছেন।

উপাদান ১.৪

material3 লাইব্রেরির 1.4.0 সংস্করণে বেশ কিছু নতুন উপাদান এবং উন্নত বৈশিষ্ট্য যোগ করা হয়েছে:

  • TextField এখন একটি পরীক্ষামূলক TextFieldState ভিত্তিক সংস্করণ অফার করছে, যা টেক্সটের অবস্থা ব্যবস্থাপনার জন্য একটি আরও শক্তিশালী পদ্ধতি প্রদান করে। এছাড়াও, নতুন SecureTextField এবং OutlinedSecureTextField ভ্যারিয়েন্টগুলো এখন উপলব্ধ। ম্যাটেরিয়াল Text কম্পোজেবল এখন autoSize আচরণ সমর্থন করে।
  • ক্যারোসেল কম্পোনেন্টটিতে এখন একটি নতুন HorizontalCenteredHeroCarousel ভ্যারিয়েন্ট যুক্ত হয়েছে।
  • TimePicker এখন পিকার এবং ইনপুট মোডের মধ্যে পরিবর্তন করা সমর্থন করে।
  • একটি ভার্টিকাল ড্র্যাগ হ্যান্ডেল ব্যবহারকারীদের একটি অ্যাডাপ্টিভ পেনের আকার এবং/অথবা অবস্থান পরিবর্তন করতে সাহায্য করে।
centered-hero-carousel.webp

অনুভূমিক কেন্দ্রিক হিরো ক্যারোসেল

উল্লেখ্য যে, material3 লাইব্রেরির আলফা রিলিজগুলোতে Material 3 Expressive API-গুলোর উন্নয়ন অব্যাহত রয়েছে। আরও জানতে, এই সাম্প্রতিক আলোচনাটি দেখুন:

নতুন অ্যানিমেশন বৈশিষ্ট্য

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

গতিশীল ভাগ করা উপাদান

ডিফল্টরূপে, sharedElement() এবং sharedBounds() অ্যানিমেশনগুলো অ্যানিমেট করার চেষ্টা করে

টার্গেট স্টেটে কোনো মিলযুক্ত কী খুঁজে পাওয়া গেলেই লেআউট পরিবর্তিত হয়। তবে, আপনি নেভিগেশনের দিক বা বর্তমান UI স্টেটের মতো নির্দিষ্ট কিছু শর্তের উপর ভিত্তি করে এই অ্যানিমেশনটি ডাইনামিকভাবে নিষ্ক্রিয় করতে চাইতে পারেন।

শেয়ার করা এলিমেন্টের ট্রানজিশন ঘটবে কিনা তা নিয়ন্ত্রণ করতে, আপনি এখন rememberSharedContentState() -এ পাস করা SharedContentConfig কাস্টমাইজ করতে পারেন। isEnabled প্রপার্টিটি নির্ধারণ করে যে শেয়ার করা এলিমেন্টটি সক্রিয় থাকবে কিনা।

SharedTransitionLayout {

        val transition = updateTransition(currentState)

        transition.AnimatedContent { targetState ->

            // Create the configuration that depends on state changing.

            fun animationConfig() : SharedTransitionScope.SharedContentConfig {

                return object : SharedTransitionScope.SharedContentConfig {

                    override val SharedTransitionScope.SharedContentState.isEnabled: Boolean

                        get() =

                            // determine whether to perform a shared element transition

                }

            }

}

আরও তথ্যের জন্য ডকুমেন্টেশন দেখুন।

Modifier.skipToLookaheadPosition()

এই রিলিজে Modifier.skipToLookaheadPosition() একটি নতুন মডিফায়ার যোগ করা হয়েছে, যা শেয়ার্ড এলিমেন্ট অ্যানিমেশন করার সময় একটি কম্পোজেবল এলিমেন্টের চূড়ান্ত অবস্থান অপরিবর্তিত রাখে। এর ফলে “রিভিল” ধরনের ট্রানজিশন অ্যানিমেশন করা সম্ভব হয়, যেমনটা ক্যামেরার প্রগ্রেসিভ রিভিল সহ Androidify স্যাম্পলটিতে দেখা যায়। আরও তথ্যের জন্য এখানে ভিডিও টিপটি দেখুন:

ভাগ করা উপাদান রূপান্তরে প্রাথমিক বেগ

এই রিলিজে prepareTransitionWithInitialVelocity একটি নতুন শেয়ার্ড এলিমেন্ট ট্রানজিশন এপিআই যোগ করা হয়েছে, যা আপনাকে একটি শেয়ার্ড এলিমেন্ট ট্রানজিশনে প্রাথমিক বেগ (যেমন কোনো জেসচার থেকে) পাস করার সুযোগ দেয়:

Modifier.fillMaxSize()

    .draggable2D(

        rememberDraggable2DState { offset += it },

        onDragStopped = { velocity ->

            // Set up the initial velocity for the upcoming shared element

            // transition.

            sharedContentStateForDraggableCat

                ?.prepareTransitionWithInitialVelocity(velocity)

            showDetails = false

        },

    )
fling-shared.gif

একটি শেয়ার্ড এলিমেন্ট ট্রানজিশন যা একটি জেসচার থেকে প্রাথমিক বেগ দিয়ে শুরু হয়।

আবৃত রূপান্তর

EnterTransition এবং ExitTransition নির্ধারণ করে যে একটি AnimatedVisibility / AnimatedContent কম্পোজেবল কীভাবে প্রদর্শিত বা অদৃশ্য হবে। একটি নতুন পরীক্ষামূলক ভেইল অপশন আপনাকে কন্টেন্টকে আড়াল বা স্ক্রিম করার জন্য একটি রঙ নির্দিষ্ট করার সুযোগ দেয়; যেমন, কন্টেন্টের উপর একটি আধা-স্বচ্ছ কালো স্তরকে ধীরে ধীরে দৃশ্যমান বা অদৃশ্য করা।

veil_2.gif

আবৃত অ্যানিমেটেড কন্টেন্ট – অ্যানিমেশন চলাকালীন গ্রিড কন্টেন্টের উপর থাকা অর্ধ-স্বচ্ছ আবরণটি (বা স্ক্রিম) লক্ষ্য করুন।

AnimatedContent(

    targetState = page,

    modifier = Modifier.fillMaxSize().weight(1f),

    transitionSpec = {

        if (targetState > initialState) {

            (slideInHorizontally { it } togetherWith

                    slideOutHorizontally { -it / 2 } + veilOut(targetColor = veilColor))

        } else {

            slideInHorizontally { -it / 2 } +

                    unveilIn(initialColor = veilColor) togetherWith slideOutHorizontally { it }

        }

    },

) { targetPage ->

    ...

}

আসন্ন পরিবর্তন

Modifier.onFirstVisible-এর অবলুপ্তি

Compose 1.9-এ Modifier.onVisibilityChanged এবং Modifier.onFirstVisible চালু করা হয়েছিল। আপনাদের মতামত পর্যালোচনার পর এটি স্পষ্ট হয়ে ওঠে যে Modifier.onFirstVisible এর চুক্তিটি সুনির্দিষ্টভাবে পালন করা সম্ভব ছিল না; বিশেষত, যখন কোনো আইটেম প্রথম দৃশ্যমান হয়। উদাহরণস্বরূপ, একটি Lazy লেআউট ভিউপোর্ট থেকে স্ক্রল করে বেরিয়ে যাওয়া আইটেমগুলোকে ডিসপোজ করে দিতে পারে, এবং সেগুলো আবার স্ক্রল করে ভিউতে ফিরে এলে পুনরায় কম্পোজ করতে পারে। এই পরিস্থিতিতে, onFirstVisible কলব্যাকটি আবার ফায়ার হতো, কারণ এটি একটি নতুন কম্পোজ করা আইটেম। পূর্বে ভিজিট করা কোনো স্ক্রিনে ফিরে যাওয়ার সময়ও একই ধরনের আচরণ দেখা যেত, যেখানে onFirstVisible ছিল। তাই, আমরা পরবর্তী Compose রিলিজে (1.11) এই মডিফায়ারটিকে ডেপ্রিকেটেড করার সিদ্ধান্ত নিয়েছি এবং onVisibilityChanged এ মাইগ্রেট করার পরামর্শ দিচ্ছি। আরও তথ্যের জন্য ডকুমেন্টেশন দেখুন।

পরীক্ষায় কো-রুটিন প্রেরণ

টেস্টের অস্থিরতা কমাতে এবং আরও বেশি সমস্যা ধরতে আমরা টেস্টের কো-রুটিন ডিসপ্যাচ পরিবর্তন করার পরিকল্পনা করছি। বর্তমানে, টেস্টগুলো UnconfinedTestDispatcher ব্যবহার করে, যা প্রোডাকশনের আচরণের থেকে ভিন্ন; যেমন, ইফেক্টগুলো কিউতে যুক্ত না হয়ে সাথে সাথেই চলতে পারে। ভবিষ্যতের কোনো রিলিজে, আমরা একটি নতুন এপিআই চালু করার পরিকল্পনা করছি যা প্রোডাকশনের আচরণের সাথে মিল রেখে ডিফল্টরূপে StandardTestDispatcher ব্যবহার করবে। আপনি এখন 1.10 সংস্করণে এই নতুন আচরণটি চেষ্টা করে দেখতে পারেন:

@get:Rule // also createAndroidComposeRule, createEmptyComposeRule

val rule = createComposeRule(effectContext = StandardTestDispatcher())

StandardTestDispatcher ব্যবহার করলে টাস্কগুলো কিউতে জমা হয়, তাই আপনাকে অবশ্যই composeTestRule.waitForIdle() বা composeTestRule.runOnIdle() এর মতো সিনক্রোনাইজেশন মেকানিজম ব্যবহার করতে হবে। যদি আপনার টেস্টে runTest ব্যবহৃত হয়, তবে আপনাকে অবশ্যই নিশ্চিত করতে হবে যে সিনক্রোনাইজেশনের জন্য runTest এবং আপনার Compose রুল একই StandardTestDispatcher ইনস্ট্যান্স ব্যবহার করছে।

// 1. Create a SINGLE dispatcher instance

val testDispatcher = StandardTestDispatcher()



// 2. Pass it to your Compose rule

@get:Rule

val composeRule = createComposeRule(effectContext = testDispatcher)



@Test

// 3. Pass the *SAME INSTANCE* to runTest

fun myTest() = runTest(testDispatcher) {

    composeRule.setContent { /* ... */ }

}

সরঞ্জাম

চমৎকার এপিআই-এর জন্য চমৎকার টুল প্রয়োজন, এবং অ্যান্ড্রয়েড স্টুডিওতে কম্পোজ ডেভেলপারদের জন্য সম্প্রতি বেশ কিছু নতুন সংযোজন করা হয়েছে:

এই সরঞ্জামগুলোর কার্যকারিতা দেখতে, এই সাম্প্রতিক প্রদর্শনীটি দেখুন:

শুভ রচনা

সুন্দর ও সমৃদ্ধ ইউআই (UI) তৈরির জন্য আপনার প্রয়োজনীয় এপিআই (API) এবং টুলস সরবরাহ করতে আমরা জেটপ্যাক কম্পোজ (Jetpack Compose)-এ বিনিয়োগ অব্যাহত রেখেছি। আমরা আপনার মতামতকে গুরুত্ব দিই, তাই অনুগ্রহ করে এই পরিবর্তনগুলো সম্পর্কে আপনার প্রতিক্রিয়া অথবা পরবর্তীতে আপনি কী দেখতে চান, তা আমাদের ইস্যু ট্র্যাকারে (issue tracker) জানান।

    লিখেছেন:

    পড়তে থাকুন