Skip to content

Commit 6318891

Browse files
committed
[feat] #3: hiltViewModel 에서 인자를 전달받는 예시 코드 구현
1 parent 954ab0a commit 6318891

6 files changed

Lines changed: 86 additions & 5 deletions

File tree

feature/sample/api/src/main/java/com/neki/android/feature/sample/api/MyClass.kt

Lines changed: 0 additions & 4 deletions
This file was deleted.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.neki.android.feature.sample.api
2+
3+
import androidx.navigation3.runtime.NavKey
4+
import com.neki.android.core.navigation.Navigator
5+
import kotlinx.serialization.Serializable
6+
7+
sealed interface SampleNavKey : NavKey {
8+
9+
@Serializable
10+
data class Sample(val id: Long) : SampleNavKey
11+
}
12+
13+
fun Navigator.navigateToSample(id: Long) {
14+
navigate(SampleNavKey.Sample(id))
15+
}

feature/sample/impl/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,5 @@ dependencies {
1010
implementation(libs.androidx.activity.compose)
1111
implementation(libs.androidx.appcompat)
1212
implementation(libs.androidx.core.ktx)
13-
13+
implementation(projects.feature.sample.api)
1414
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.neki.android.feature.sample.impl
2+
3+
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
4+
import androidx.navigation3.runtime.EntryProviderScope
5+
import androidx.navigation3.runtime.NavKey
6+
import com.neki.android.core.navigation.EntryProviderInstaller
7+
import com.neki.android.core.navigation.Navigator
8+
import com.neki.android.feature.sample.api.SampleNavKey
9+
import dagger.Module
10+
import dagger.Provides
11+
import dagger.hilt.InstallIn
12+
import dagger.hilt.android.components.ActivityRetainedComponent
13+
import dagger.multibindings.IntoSet
14+
15+
@Module
16+
@InstallIn(ActivityRetainedComponent::class)
17+
object SampleEntryProviderModule {
18+
19+
@IntoSet
20+
@Provides
21+
fun provideSampleEntryBuilder(navigator: Navigator): EntryProviderInstaller = {
22+
sampleEntry(navigator)
23+
}
24+
}
25+
26+
private fun EntryProviderScope<NavKey>.sampleEntry(navigator: Navigator) {
27+
entry<SampleNavKey.Sample> { key ->
28+
val viewModel = hiltViewModel<SampleViewModel, SampleViewModel.Factory>(
29+
creationCallback = { factory ->
30+
factory.create(key)
31+
}
32+
)
33+
SampleScreen(viewModel = viewModel)
34+
}
35+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.neki.android.feature.sample.impl
2+
3+
import androidx.compose.material3.Text
4+
import androidx.compose.runtime.Composable
5+
import androidx.compose.ui.Modifier
6+
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
7+
8+
@Composable
9+
fun SampleScreen(
10+
modifier: Modifier = Modifier,
11+
viewModel: SampleViewModel = hiltViewModel(),
12+
) {
13+
Text("Sample")
14+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.neki.android.feature.sample.impl
2+
3+
import androidx.lifecycle.ViewModel
4+
import com.neki.android.feature.sample.api.SampleNavKey
5+
import dagger.assisted.Assisted
6+
import dagger.assisted.AssistedFactory
7+
import dagger.assisted.AssistedInject
8+
import dagger.hilt.android.lifecycle.HiltViewModel
9+
10+
@HiltViewModel(assistedFactory = SampleViewModel.Factory::class)
11+
class SampleViewModel @AssistedInject constructor(
12+
@Assisted val navKey: SampleNavKey.Sample,
13+
) : ViewModel() {
14+
15+
val id = navKey.id
16+
17+
@AssistedFactory
18+
interface Factory {
19+
fun create(navKey: SampleNavKey.Sample): SampleViewModel
20+
}
21+
}

0 commit comments

Comments
 (0)