Skip to content

Commit 6bd8322

Browse files
committed
[fix] #91 Root 화면 전환 시 이전 Root 스택의 ViewModel 제거 로직 추가
1 parent a6a9372 commit 6bd8322

3 files changed

Lines changed: 29 additions & 3 deletions

File tree

core/navigation/src/main/java/com/neki/android/core/navigation/HiltSharedViewModelStoreNavEntryDecorator.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ fun <T : Any> rememberHiltSharedViewModelStoreNavEntryDecorator(
5151
* hiltViewModel()과 함께 사용 가능.
5252
*/
5353
class HiltSharedViewModelStoreNavEntryDecorator<T : Any>(
54-
viewModelStore: ViewModelStore,
54+
private val viewModelStore: ViewModelStore,
5555
removeViewModelStoreOnPop: () -> Boolean,
5656
) : NavEntryDecorator<T>(
5757
onPop = { key ->
@@ -95,6 +95,10 @@ class HiltSharedViewModelStoreNavEntryDecorator<T : Any>(
9595
}
9696
},
9797
) {
98+
fun clearAll() {
99+
viewModelStore.getHiltEntryViewModel().clearAll()
100+
}
101+
98102
companion object {
99103
private const val PARENT_CONTENT_KEY = "hilt_shared_decorator_parent_content_key"
100104

@@ -116,6 +120,11 @@ private class HiltEntryViewModel : ViewModel() {
116120
owners.remove(key)?.clear()
117121
}
118122

123+
fun clearAll() {
124+
owners.forEach { (_, store) -> store.clear() }
125+
owners.clear()
126+
}
127+
119128
override fun onCleared() {
120129
owners.forEach { (_, store) -> store.clear() }
121130
}

core/navigation/src/main/java/com/neki/android/core/navigation/NavigationState.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.neki.android.core.navigation
22

33
import androidx.compose.runtime.Composable
4+
import androidx.compose.runtime.DisposableEffect
45
import androidx.compose.runtime.derivedStateOf
56
import androidx.compose.runtime.getValue
67
import androidx.compose.runtime.mutableStateListOf
@@ -32,11 +33,12 @@ class NavigationState @Inject constructor(
3233
fun NavigationState.toEntries(
3334
entryProvider: (NavKey) -> NavEntry<NavKey>,
3435
): SnapshotStateList<NavEntry<NavKey>> {
36+
val hvmd = rememberHiltSharedViewModelStoreNavEntryDecorator<NavKey>()
3537
val decoratedEntries = subStacks.mapValues { (_, stack) ->
3638
val decorators = listOf(
3739
rememberSaveableStateHolderNavEntryDecorator<NavKey>(),
3840
rememberViewModelStoreNavEntryDecorator<NavKey>(),
39-
rememberHiltSharedViewModelStoreNavEntryDecorator(),
41+
hvmd,
4042
)
4143
rememberDecoratedNavEntries(
4244
backStack = stack,
@@ -45,6 +47,12 @@ fun NavigationState.toEntries(
4547
)
4648
}
4749

50+
DisposableEffect(Unit) {
51+
onDispose {
52+
hvmd.clearAll()
53+
}
54+
}
55+
4856
return topLevelStack
4957
.flatMap { decoratedEntries[it] ?: emptyList() }
5058
.toMutableStateList()

core/navigation/src/main/java/com/neki/android/core/navigation/auth/AuthNavigationState.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.neki.android.core.navigation.auth
22

33
import androidx.compose.runtime.Composable
4+
import androidx.compose.runtime.DisposableEffect
45
import androidx.compose.runtime.derivedStateOf
56
import androidx.compose.runtime.getValue
67
import androidx.compose.runtime.mutableStateListOf
@@ -25,11 +26,19 @@ class AuthNavigationState @Inject constructor(
2526
fun AuthNavigationState.toEntries(
2627
entryProvider: (NavKey) -> NavEntry<NavKey>,
2728
): SnapshotStateList<NavEntry<NavKey>> {
29+
val hvmd = rememberHiltSharedViewModelStoreNavEntryDecorator<NavKey>()
2830
val decorators = listOf(
2931
rememberSaveableStateHolderNavEntryDecorator<NavKey>(),
3032
rememberViewModelStoreNavEntryDecorator<NavKey>(),
31-
rememberHiltSharedViewModelStoreNavEntryDecorator(),
33+
hvmd,
3234
)
35+
36+
DisposableEffect(Unit) {
37+
onDispose {
38+
hvmd.clearAll()
39+
}
40+
}
41+
3342
return rememberDecoratedNavEntries(
3443
backStack = stack,
3544
entryDecorators = decorators,

0 commit comments

Comments
 (0)