রচনা এবং অন্যান্য লাইব্রেরি

আপনি রচনায় আপনার প্রিয় লাইব্রেরি ব্যবহার করতে পারেন। এই বিভাগটি বর্ণনা করে যে কিভাবে কয়েকটি সবচেয়ে দরকারী লাইব্রেরি অন্তর্ভুক্ত করা যায়।

কার্যকলাপ

কোনো অ্যাক্টিভিটিতে কম্পোজ ব্যবহার করতে, আপনাকে অবশ্যই ComponentActivity ব্যবহার করতে হবে, Activity একটি সাবক্লাস যা কম্পোজ করার জন্য উপযুক্ত LifecycleOwner এবং উপাদান প্রদান করে। এটি অতিরিক্ত API প্রদান করে যা আপনার কার্যকলাপ ক্লাসে ওভাররাইডিং পদ্ধতি থেকে আপনার কোডকে ডিকপল করে। অ্যাক্টিভিটি কম্পোজ এই APIগুলিকে কম্পোজেবলের কাছে প্রকাশ করে যেমন আপনার কম্পোজেবলের বাইরের পদ্ধতিগুলিকে ওভাররাইড করা বা একটি স্পষ্ট Activity উদাহরণ পুনরুদ্ধার করার আর প্রয়োজন নেই৷ অধিকন্তু, এই APIগুলি নিশ্চিত করে যে সেগুলি শুধুমাত্র একবার শুরু করা হয়েছে, পুনর্গঠন টিকে আছে এবং কম্পোজেবলটি কম্পোজিশন থেকে সরানো হলে সঠিকভাবে পরিষ্কার করা হয়।

কার্যকলাপ ফলাফল

rememberLauncherForActivityResult() API আপনাকে আপনার রচনাযোগ্য একটি কার্যকলাপ থেকে ফলাফল পেতে অনুমতি দেয়:

@Composable
fun GetContentExample() {
    var imageUri by remember { mutableStateOf<Uri?>(null) }
    val launcher = rememberLauncherForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? ->
        imageUri = uri
    }
    Column {
        Button(onClick = { launcher.launch("image/*") }) {
            Text(text = "Load Image")
        }
        Image(
            painter = rememberAsyncImagePainter(imageUri),
            contentDescription = "My Image"
        )
    }
}

এই উদাহরণটি একটি সাধারণ GetContent() চুক্তি প্রদর্শন করে। বোতামটি আলতো চাপলে অনুরোধটি চালু হয়। rememberLauncherForActivityResult() এর জন্য ট্রেলিং ল্যাম্বডা ব্যবহার করা হয় একবার ব্যবহারকারী একটি ছবি নির্বাচন করে এবং লঞ্চিং কার্যকলাপে ফিরে আসে। এটি Coil এর rememberImagePainter() ফাংশন ব্যবহার করে নির্বাচিত ছবি লোড করে।

ActivityResultContract এর যেকোনো উপশ্রেণি rememberLauncherForActivityResult() জন্য প্রথম আর্গুমেন্ট হিসেবে ব্যবহার করা যেতে পারে। এর মানে হল যে আপনি এই কৌশলটি ফ্রেমওয়ার্ক থেকে এবং অন্যান্য সাধারণ প্যাটার্ন থেকে সামগ্রীর অনুরোধ করতে ব্যবহার করতে পারেন৷ আপনি আপনার নিজস্ব কাস্টম চুক্তি তৈরি করতে পারেন এবং এই কৌশলটি ব্যবহার করতে পারেন।

রানটাইম অনুমতি অনুরোধ করা হচ্ছে

একই অ্যাক্টিভিটি রেজাল্ট এপিআই এবং উপরে ব্যাখ্যা করা rememberLauncherForActivityResult() একটি একক অনুমতির জন্য RequestPermission চুক্তি বা একাধিক অনুমতির জন্য RequestMultiplePermissions চুক্তি ব্যবহার করে রানটাইম অনুমতির অনুরোধ করতে ব্যবহার করা যেতে পারে।

Accompanist পারমিশন লাইব্রেরিটি সেই APIগুলির উপরে একটি স্তর ব্যবহার করা যেতে পারে যা আপনার কম্পোজ UI ব্যবহার করতে পারে এমন রাজ্যে অনুমতির জন্য বর্তমান মঞ্জুরি রাজ্যকে ম্যাপ করতে।

সিস্টেম ব্যাক বোতাম হ্যান্ডলিং

কাস্টম ব্যাক নেভিগেশন প্রদান করতে এবং আপনার কম্পোজেবলের মধ্যে থেকে সিস্টেম ব্যাক বোতামের ডিফল্ট আচরণকে ওভাররাইড করতে, আপনার কম্পোজেবল সেই ইভেন্টটিকে আটকাতে একটি BackHandler ব্যবহার করতে পারে:

var backHandlingEnabled by remember { mutableStateOf(true) }
BackHandler(backHandlingEnabled) {
    // Handle back press
}

BackHandler বর্তমানে সক্রিয় কিনা তা প্রথম আর্গুমেন্ট নিয়ন্ত্রণ করে; আপনি আপনার উপাদানের অবস্থার উপর ভিত্তি করে আপনার হ্যান্ডলারকে অস্থায়ীভাবে নিষ্ক্রিয় করতে এই যুক্তিটি ব্যবহার করতে পারেন। যদি ব্যবহারকারী একটি সিস্টেম ব্যাক ইভেন্ট ট্রিগার করে এবং BackHandler বর্তমানে সক্রিয় থাকে তবে ট্রেলিং ল্যাম্বডাকে আহ্বান করা হবে।

ViewModel

আপনি যদি আর্কিটেকচার কম্পোনেন্টস ভিউমডেল লাইব্রেরি ব্যবহার করেন, আপনি viewModel() ফাংশন কল করে যেকোন কম্পোজেবল থেকে একটি ViewModel অ্যাক্সেস করতে পারেন। আপনার Gradle ফাইলে নিম্নলিখিত নির্ভরতা যোগ করুন:

গ্রোভি

dependencies {
    implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.8.5'
}

কোটলিন

dependencies {
    implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.8.5")
}

তারপর আপনি আপনার কোডে viewModel() ফাংশন ব্যবহার করতে পারেন।

class MyViewModel : ViewModel() { /*...*/ }

// import androidx.lifecycle.viewmodel.compose.viewModel
@Composable
fun MyScreen(
    viewModel: MyViewModel = viewModel()
) {
    // use viewModel here
}

viewModel() একটি বিদ্যমান ViewModel প্রদান করে বা একটি নতুন তৈরি করে। ডিফল্টরূপে, প্রত্যাবর্তিত ViewModel টি এনক্লোজিং অ্যাক্টিভিটি, ফ্র্যাগমেন্ট বা নেভিগেশন গন্তব্যে স্কোপ করা হয় এবং যতক্ষণ পর্যন্ত স্কোপটি জীবিত থাকে ততক্ষণ ধরে রাখা হয়।

উদাহরণস্বরূপ, যদি কম্পোজেবল একটি কার্যকলাপে ব্যবহার করা হয়, viewModel() কার্যকলাপটি শেষ না হওয়া পর্যন্ত বা প্রক্রিয়াটি শেষ না হওয়া পর্যন্ত একই উদাহরণ প্রদান করে।

class MyViewModel : ViewModel() { /*...*/ }
// import androidx.lifecycle.viewmodel.compose.viewModel
@Composable
fun MyScreen(
    // Returns the same instance as long as the activity is alive,
    // just as if you grabbed the instance from an Activity or Fragment
    viewModel: MyViewModel = viewModel()
) { /* ... */ }

@Composable
fun MyScreen2(
    viewModel: MyViewModel = viewModel() // Same instance as in MyScreen
) { /* ... */ }

ব্যবহারের নির্দেশিকা

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

ViewModel দৃষ্টান্তগুলিকে অন্যান্য কম্পোজেবলগুলিতে পাস করা এড়াতে চেষ্টা করুন কারণ এটি সেই কম্পোজেবলগুলিকে পরীক্ষা করা আরও কঠিন করে তুলতে পারে এবং প্রিভিউ ভেঙে দিতে পারে। পরিবর্তে, প্যারামিটার হিসাবে তাদের প্রয়োজনীয় ডেটা এবং ফাংশনগুলি পাস করুন৷

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

যদি আপনার ViewModel নির্ভরতা থাকে, viewModel() একটি ঐচ্ছিক ViewModelProvider.Factory একটি প্যারামিটার হিসেবে নেয়।

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

তথ্য প্রবাহ

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

  • LiveData.observeAsState() androidx.compose.runtime:runtime-livedata:$composeVersion আর্টিফ্যাক্টে অন্তর্ভুক্ত।
  • Flow.collectAsState() এর অতিরিক্ত নির্ভরতার প্রয়োজন নেই।
  • Observable.subscribeAsState() androidx.compose.runtime:runtime-rxjava2:$composeVersion বা androidx.compose.runtime:runtime-rxjava3:$composeVersion আর্টিফ্যাক্টে অন্তর্ভুক্ত।

এই শিল্পকর্মগুলি শ্রোতা হিসাবে নিবন্ধন করে এবং State হিসাবে মানগুলিকে উপস্থাপন করে৷ যখনই একটি নতুন মান নির্গত হয়, কম্পোজ UI এর সেই অংশগুলিকে পুনর্গঠন করে যেখানে সেই state.value ব্যবহার করা হয়৷ উদাহরণস্বরূপ, এই কোডে, ShowData প্রতিবার exampleLiveData একটি নতুন মান নির্গত করার সময় পুনর্গঠন করে।

// import androidx.lifecycle.viewmodel.compose.viewModel
@Composable
fun MyScreen(
    viewModel: MyViewModel = viewModel()
) {
    val dataExample = viewModel.exampleLiveData.observeAsState()

    // Because the state is read here,
    // MyScreen recomposes whenever dataExample changes.
    dataExample.value?.let {
        ShowData(dataExample)
    }
}

রচনায় অ্যাসিঙ্ক্রোনাস অপারেশন

জেটপ্যাক কম্পোজ আপনাকে আপনার কম্পোজেবলের মধ্যে থেকে কোরোটিন ব্যবহার করে অ্যাসিঙ্ক্রোনাস অপারেশন চালাতে দেয়।

আরও তথ্যের জন্য পার্শ্ব প্রতিক্রিয়া ডকুমেন্টেশনে LaunchedEffect , produceState , এবং rememberCoroutineScope API গুলি দেখুন৷

নেভিগেশন কম্পোনেন্ট জেটপ্যাক কম্পোজ অ্যাপ্লিকেশনের জন্য সমর্থন প্রদান করে। আরও তথ্যের জন্য কম্পোজের সাথে নেভিগেটিং দেখুন এবং জেটপ্যাক নেভিগেশন নেভিগেশন কম্পোজে স্থানান্তর করুন

হিল্ট

হিল্ট হল অ্যান্ড্রয়েড অ্যাপ্লিকেশানগুলিতে নির্ভরতা ইনজেকশনের জন্য প্রস্তাবিত সমাধান এবং রচনার সাথে নির্বিঘ্নে কাজ করে৷

ViewModel বিভাগে উল্লিখিত viewModel() ফাংশনটি স্বয়ংক্রিয়ভাবে ViewModel ব্যবহার করে যা Hilt @HiltViewModel টীকা দিয়ে তৈরি করে। আমরা হিল্টের ভিউমডেল ইন্টিগ্রেশন সম্পর্কে তথ্য সহ ডকুমেন্টেশন প্রদান করেছি।

@HiltViewModel
class MyViewModel @Inject constructor(
    private val savedStateHandle: SavedStateHandle,
    private val repository: ExampleRepository
) : ViewModel() { /* ... */ }

// import androidx.lifecycle.viewmodel.compose.viewModel
@Composable
fun MyScreen(
    viewModel: MyViewModel = viewModel()
) { /* ... */ }

হিল্ট এবং নেভিগেশন

হিল্ট নেভিগেশন কম্পোজ লাইব্রেরির সাথেও একীভূত হয়। আপনার Gradle ফাইলে নিম্নলিখিত অতিরিক্ত নির্ভরতা যোগ করুন:

গ্রোভি

dependencies {
    implementation 'androidx.hilt:hilt-navigation-compose:1.2.0'
}

কোটলিন

dependencies {
    implementation("androidx.hilt:hilt-navigation-compose:1.2.0")
}

নেভিগেশন কম্পোজ ব্যবহার করার সময়, আপনার @HiltViewModel টীকাযুক্ত ViewModel এর একটি উদাহরণ পেতে সর্বদা hiltViewModel কম্পোজযোগ্য ফাংশনটি ব্যবহার করুন। এটি @AndroidEntryPoint এর সাথে টীকাযুক্ত টুকরো বা ক্রিয়াকলাপগুলির সাথে কাজ করে।

উদাহরণস্বরূপ, যদি ExampleScreen একটি নেভিগেশন গ্রাফে একটি গন্তব্য হয়, তাহলে নীচের কোড স্নিপেটে দেখানো গন্তব্যে ExampleViewModel এর একটি উদাহরণ পেতে hiltViewModel() কল করুন:

// import androidx.hilt.navigation.compose.hiltViewModel

@Composable
fun MyApp() {
    val navController = rememberNavController()
    val startRoute = "example"
    NavHost(navController, startDestination = startRoute) {
        composable("example") { backStackEntry ->
            // Creates a ViewModel from the current BackStackEntry
            // Available in the androidx.hilt:hilt-navigation-compose artifact
            val viewModel = hiltViewModel<MyViewModel>()
            MyScreen(viewModel)
        }
        /* ... */
    }
}

আপনি যদি ন্যাভিগেশন রুট বা নেভিগেশন গ্রাফে স্কোপ করা একটি ViewModel উদাহরণ পুনরুদ্ধার করতে চান তবে hiltViewModel কম্পোজেবল ফাংশনটি ব্যবহার করুন এবং একটি প্যারামিটার হিসাবে সংশ্লিষ্ট backStackEntry পাস করুন:

// import androidx.hilt.navigation.compose.hiltViewModel
// import androidx.navigation.compose.getBackStackEntry

@Composable
fun MyApp() {
    val navController = rememberNavController()
    val startRoute = "example"
    val innerStartRoute = "exampleWithRoute"
    NavHost(navController, startDestination = startRoute) {
        navigation(startDestination = innerStartRoute, route = "Parent") {
            // ...
            composable("exampleWithRoute") { backStackEntry ->
                val parentEntry = remember(backStackEntry) {
                    navController.getBackStackEntry("Parent")
                }
                val parentViewModel = hiltViewModel<ParentViewModel>(parentEntry)
                ExampleWithRouteScreen(parentViewModel)
            }
        }
    }
}

পেজিং

পেজিং লাইব্রেরি আপনার জন্য ধীরে ধীরে ডেটা লোড করা সহজ করে তোলে এবং এটি রচনাতে সমর্থিত। পেজিং রিলিজ পৃষ্ঠায় অতিরিক্ত paging-compose নির্ভরতা সম্পর্কে তথ্য রয়েছে যা প্রকল্প এবং এর সংস্করণে যোগ করতে হবে।

এখানে পেজিং লাইব্রেরির কম্পোজ API-এর একটি উদাহরণ দেওয়া হল:

@Composable
fun MyScreen(flow: Flow<PagingData<String>>) {
    val lazyPagingItems = flow.collectAsLazyPagingItems()
    LazyColumn {
        items(
            lazyPagingItems.itemCount,
            key = lazyPagingItems.itemKey { it }
        ) { index ->
            val item = lazyPagingItems[index]
            Text("Item is $item")
        }
    }
}

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

মানচিত্র

আপনি আপনার অ্যাপে Google মানচিত্র প্রদান করতে মানচিত্র রচনা লাইব্রেরি ব্যবহার করতে পারেন। এখানে একটি ব্যবহার উদাহরণ:

@Composable
fun MapsExample() {
    val singapore = LatLng(1.35, 103.87)
    val cameraPositionState = rememberCameraPositionState {
        position = CameraPosition.fromLatLngZoom(singapore, 10f)
    }
    GoogleMap(
        modifier = Modifier.fillMaxSize(),
        cameraPositionState = cameraPositionState
    ) {
        Marker(
            state = remember { MarkerState(position = singapore) },
            title = "Singapore",
            snippet = "Marker in Singapore"
        )
    }
}

{% শব্দার্থে %} {% endverbatim %} {% শব্দার্থে %} {% endverbatim %}