সেভ করা পৃষ্ঠা গুছিয়ে রাখতে 'সংগ্রহ' ব্যবহার করুন
আপনার পছন্দ অনুযায়ী কন্টেন্ট সেভ করুন ও সঠিক বিভাগে রাখুন।
ভিউমডেল (হিল্ট) এ আর্গুমেন্ট পাস করা
এই রেসিপিটি দেখায় যে কীভাবে নির্ভরতা ইনজেকশনের জন্য Hilt ব্যবহার করে একটি ViewModel এ নেভিগেশন আর্গুমেন্ট (কী) পাস করতে হয়।
কিভাবে এটা কাজ করে
এই উদাহরণে ড্যাগার/হিল্টের সহায়তাপ্রাপ্ত ইনজেকশন বৈশিষ্ট্য ব্যবহার করা হয়েছে:
-
ViewModel @HiltViewModel দিয়ে টীকাযুক্ত এবং এর কনস্ট্রাক্টর নেভিগেশন কী (যা @Assisted দিয়ে টীকাযুক্ত) গ্রহণ করতে @AssistedInject ব্যবহার করে। -
ViewModel তৈরি করার জন্য একটি @AssistedFactory ইন্টারফেস সংজ্ঞায়িত করা হয়েছে। -
ViewModel ইনস্ট্যান্স পেতে hiltViewModel composable ফাংশন ব্যবহার করা হয়। নেভিগেশন কীটি ফ্যাক্টরিতে পাঠানোর জন্য একটি creationCallback প্রদান করা হয়, যা এটি ViewModel এ উপলব্ধ করে।
দ্রষ্টব্য : rememberViewModelStoreNavEntryDecorator NavDisplay এর entryDecorators এ যোগ করা হয়েছে। এটি নিশ্চিত করে যে ViewModel গুলি তাদের সংশ্লিষ্ট NavEntry এর সাথে সঠিকভাবে সংযুক্ত, যাতে প্রতিটি অনন্য নেভিগেশন কী এর জন্য একটি নতুন ViewModel ইনস্ট্যান্স তৈরি করা হয়।

অন্বেষণ করুন
সম্পূর্ণ রেসিপিটি GitHub-এ দেখুন।
arrow_forward /*
* Copyright 2025 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.example.nav3recipes.passingarguments.viewmodels.hilt
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.remember
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
import androidx.lifecycle.ViewModel
import androidx.lifecycle.compose.dropUnlessResumed
import androidx.lifecycle.viewmodel.navigation3.rememberViewModelStoreNavEntryDecorator
import androidx.navigation3.runtime.entryProvider
import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator
import androidx.navigation3.ui.NavDisplay
import com.example.nav3recipes.content.ContentBlue
import com.example.nav3recipes.content.ContentGreen
import com.example.nav3recipes.passingarguments.viewmodels.basic.RouteB
import com.example.nav3recipes.ui.setEdgeToEdgeConfig
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import dagger.hilt.android.AndroidEntryPoint
import dagger.hilt.android.lifecycle.HiltViewModel
data object RouteA
data class RouteB(val id: String)
@AndroidEntryPoint
class HiltViewModelsActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
setEdgeToEdgeConfig()
super.onCreate(savedInstanceState)
setContent {
val backStack = remember { mutableStateListOf<Any>(RouteA) }
NavDisplay(
backStack = backStack,
onBack = { backStack.removeLastOrNull() },
// In order to add the `ViewModelStoreNavEntryDecorator` (see comment below for why)
// we also need to add the default `NavEntryDecorator`s as well. These provide
// extra information to the entry's content to enable it to display correctly
// and save its state.
entryDecorators = listOf(
rememberSaveableStateHolderNavEntryDecorator(),
rememberViewModelStoreNavEntryDecorator()
),
entryProvider = entryProvider {
entry<RouteA> {
ContentGreen("Welcome to Nav3") {
LazyColumn {
items(10) { i ->
Button(onClick = dropUnlessResumed {
backStack.add(RouteB("$i"))
}) {
Text("$i")
}
}
}
}
}
entry<RouteB> { key ->
val viewModel = hiltViewModel<RouteBViewModel, RouteBViewModel.Factory>(
// Note: We need a new ViewModel for every new RouteB instance. Usually
// we would need to supply a `key` String that is unique to the
// instance, however, the ViewModelStoreNavEntryDecorator (supplied
// above) does this for us, using `NavEntry.contentKey` to uniquely
// identify the viewModel.
//
// tl;dr: Make sure you use rememberViewModelStoreNavEntryDecorator()
// if you want a new ViewModel for each new navigation key instance.
creationCallback = { factory ->
factory.create(key)
}
)
ScreenB(viewModel = viewModel)
}
}
)
}
}
}
@Composable
fun ScreenB(viewModel: RouteBViewModel) {
ContentBlue("Route id: ${viewModel.navKey.id} ")
}
@HiltViewModel(assistedFactory = RouteBViewModel.Factory::class)
class RouteBViewModel @AssistedInject constructor(
@Assisted val navKey: RouteB
) : ViewModel() {
@AssistedFactory
interface Factory {
fun create(navKey: RouteB): RouteBViewModel
}
}
ভিউমডেলগুলিতে আর্গুমেন্ট পাস করা (মৌলিক)
এই রেসিপিটি দেখায় কিভাবে একটি কাস্টম ViewModelProvider.Factory ব্যবহার করে একটি ViewModel এ নেভিগেশন আর্গুমেন্ট (কী) পাস করতে হয়।
কিভাবে এটা কাজ করে
- একটি কাস্টম
ViewModelProvider.Factory তৈরি করা হয়েছে যা নেভিগেশন কীকে একটি কনস্ট্রাক্টর প্যারামিটার হিসেবে গ্রহণ করে। - কম্পোজেবল
entry ভেতরে, viewModel(factory = ...) ব্যবহার করে ViewModel ইনস্ট্যান্স তৈরি করা হয়, যা বর্তমান নেভিগেশন কীটি ফ্যাক্টরিতে প্রেরণ করে। এর ফলে ViewModel এ নেভিগেশন কীটি উপলব্ধ হয়।
দ্রষ্টব্য : rememberViewModelStoreNavEntryDecorator NavDisplay এর entryDecorators এ যোগ করা হয়েছে। এটি নিশ্চিত করে যে ViewModel গুলি তাদের সংশ্লিষ্ট NavEntry এর সাথে সঠিকভাবে সংযুক্ত, যাতে প্রতিটি অনন্য নেভিগেশন কী এর জন্য একটি নতুন ViewModel ইনস্ট্যান্স তৈরি করা হয়।

অন্বেষণ করুন
সম্পূর্ণ রেসিপিটি GitHub-এ দেখুন।
arrow_forward /*
* Copyright 2025 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.example.nav3recipes.passingarguments.viewmodels.basic
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.remember
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.compose.dropUnlessResumed
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.lifecycle.viewmodel.navigation3.rememberViewModelStoreNavEntryDecorator
import androidx.navigation3.runtime.entryProvider
import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator
import androidx.navigation3.ui.NavDisplay
import com.example.nav3recipes.content.ContentBlue
import com.example.nav3recipes.content.ContentGreen
import com.example.nav3recipes.ui.setEdgeToEdgeConfig
data object RouteA
data class RouteB(val id: String)
class BasicViewModelsActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
setEdgeToEdgeConfig()
super.onCreate(savedInstanceState)
setContent {
val backStack = remember { mutableStateListOf<Any>(RouteA) }
NavDisplay(
backStack = backStack,
onBack = { backStack.removeLastOrNull() },
// In order to add the `ViewModelStoreNavEntryDecorator` (see comment below for why)
// we also need to add the default `NavEntryDecorator`s as well. These provide
// extra information to the entry's content to enable it to display correctly
// and save its state.
entryDecorators = listOf(
rememberSaveableStateHolderNavEntryDecorator(),
rememberViewModelStoreNavEntryDecorator()
),
entryProvider = entryProvider {
entry<RouteA> {
ContentGreen("Welcome to Nav3") {
LazyColumn {
items(10) { i ->
Button(onClick = dropUnlessResumed {
backStack.add(RouteB("$i"))
}) {
Text("$i")
}
}
}
}
}
entry<RouteB> { key ->
// Note: We need a new ViewModel for every new RouteB instance. Usually
// we would need to supply a `key` String that is unique to the
// instance, however, the ViewModelStoreNavEntryDecorator (supplied
// above) does this for us, using `NavEntry.contentKey` to uniquely
// identify the viewModel.
//
// tl;dr: Make sure you use rememberViewModelStoreNavEntryDecorator()
// if you want a new ViewModel for each new navigation key instance.
ScreenB(viewModel = viewModel(factory = RouteBViewModel.Factory(key)))
}
}
)
}
}
}
@Composable
fun ScreenB(viewModel: RouteBViewModel = viewModel()) {
ContentBlue("Route id: ${viewModel.key.id} ")
}
class RouteBViewModel(
val key: RouteB
) : ViewModel() {
class Factory(
private val key: RouteB,
) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
return RouteBViewModel(key) as T
}
}
}
ভিউমডেলগুলিতে আর্গুমেন্ট পাস করা (কোইন)
এই রেসিপিটি দেখায় যে কীভাবে নির্ভরতা ইনজেকশনের জন্য Koin ব্যবহার করে একটি ViewModel এ নেভিগেশন আর্গুমেন্ট (কী) পাস করতে হয়।
কিভাবে এটা কাজ করে
- একটি Koin মডিউল সংজ্ঞায়িত করা হয়েছে যা
ViewModel প্রদান করে। -
ViewModel ইনস্ট্যান্স পেতে koinViewModel কম্পোজেবল ফাংশন ব্যবহার করা হয়। -
parametersOf(key) ব্যবহার করে ViewModel এর কনস্ট্রাক্টরে নেভিগেশন কীটি পাঠানো হয়। এর ফলে ViewModel এর জন্য নেভিগেশন কীটি উপলব্ধ হয়।
দ্রষ্টব্য : rememberViewModelStoreNavEntryDecorator NavDisplay এর entryDecorators এ যোগ করা হয়েছে। এটি নিশ্চিত করে যে ViewModel গুলি তাদের সংশ্লিষ্ট NavEntry এর সাথে সঠিকভাবে সংযুক্ত, যাতে প্রতিটি অনন্য নেভিগেশন কী এর জন্য একটি নতুন ViewModel ইনস্ট্যান্স তৈরি করা হয়।

অন্বেষণ করুন
সম্পূর্ণ রেসিপিটি GitHub-এ দেখুন।
arrow_forward package com.example.nav3recipes.passingarguments.viewmodels.koin
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.remember
import androidx.lifecycle.ViewModel
import androidx.lifecycle.compose.dropUnlessResumed
import androidx.lifecycle.viewmodel.navigation3.rememberViewModelStoreNavEntryDecorator
import androidx.navigation3.runtime.entryProvider
import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator
import androidx.navigation3.ui.NavDisplay
import com.example.nav3recipes.content.ContentBlue
import com.example.nav3recipes.content.ContentGreen
import com.example.nav3recipes.ui.setEdgeToEdgeConfig
import org.koin.compose.KoinApplication
import org.koin.compose.viewmodel.koinViewModel
import org.koin.core.module.dsl.viewModelOf
import org.koin.core.parameter.parametersOf
import org.koin.dsl.koinConfiguration
import org.koin.dsl.module
data object RouteA
data class RouteB(val id: String)
class KoinViewModelsActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
setEdgeToEdgeConfig()
super.onCreate(savedInstanceState)
setContent {
val backStack = remember { mutableStateListOf<Any>(RouteA) }
// Koin Compose Entry point
KoinApplication(
configuration = koinConfiguration {
modules(appModule)
}
) {
NavDisplay(
backStack = backStack,
onBack = { backStack.removeLastOrNull() },
// In order to add the `ViewModelStoreNavEntryDecorator` (see comment below for why)
// we also need to add the default `NavEntryDecorator`s as well. These provide
// extra information to the entry's content to enable it to display correctly
// and save its state.
entryDecorators = listOf(
rememberSaveableStateHolderNavEntryDecorator(),
rememberViewModelStoreNavEntryDecorator()
),
entryProvider = entryProvider {
entry<RouteA> {
ContentGreen("Welcome to Nav3") {
LazyColumn {
items(10) { i ->
Button(onClick = dropUnlessResumed {
backStack.add(RouteB("$i"))
}) {
Text("$i")
}
}
}
}
}
entry<RouteB> { key ->
val viewModel = koinViewModel<RouteBViewModel> {
parametersOf(key)
}
ScreenB(viewModel = viewModel)
}
}
)
}
}
}
}
// Local Koin Module
private val appModule = module {
viewModelOf(::RouteBViewModel)
}
@Composable
fun ScreenB(viewModel: RouteBViewModel) {
ContentBlue("Route id: ${viewModel.navKey.id} ")
}
class RouteBViewModel(val navKey: RouteB) : ViewModel()
এই পৃষ্ঠার কন্টেন্ট ও কোডের নমুনাগুলি Content License-এ বর্ণিত লাইসেন্সের অধীনস্থ। Java এবং OpenJDK হল Oracle এবং/অথবা তার অ্যাফিলিয়েট সংস্থার রেজিস্টার্ড ট্রেডমার্ক।
2026-05-09 UTC-তে শেষবার আপডেট করা হয়েছে।