Skip to content

Commit 91a7bcd

Browse files
committed
fix: 라우팅 처리가 올바르지 못한 문제가 수정되었스니다
1 parent 43929c6 commit 91a7bcd

25 files changed

Lines changed: 378 additions & 157 deletions

File tree

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
kotlin version: 2.0.21
2+
error message: The daemon has terminated unexpectedly on startup attempt #1 with error code: 0. The daemon process output:
3+
1. Kotlin compile daemon is ready
4+

app/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ android {
2828
}
2929

3030
dependencies {
31-
implementation(libs.androidx.core.splashscreen)
31+
// implementation(libs.androidx.core.splashscreen)
3232
implementation(libs.androidx.browser)
3333
implementation(libs.androidx.appcompat)
3434
implementation(libs.material)
-21.9 MB
Binary file not shown.
-12.8 KB
Binary file not shown.
-12.7 KB
Binary file not shown.

app/prod/release/output-metadata.json

Lines changed: 0 additions & 37 deletions
This file was deleted.
Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
package com.lanpet.app
22

3-
import android.annotation.SuppressLint
43
import android.os.Bundle
54
import androidx.activity.ComponentActivity
65
import androidx.activity.compose.setContent
76
import androidx.activity.enableEdgeToEdge
87
import androidx.compose.runtime.CompositionLocalProvider
9-
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
8+
import androidx.navigation.compose.rememberNavController
109
import com.lanpet.core.auth.AuthManager
1110
import com.lanpet.core.auth.LocalAuthManager
1211
import com.lanpet.core.designsystem.theme.LanPetAppTheme
1312
import com.lanpet.core.manager.CoilManager
1413
import com.lanpet.core.manager.LocalCoilManager
1514
import com.lanpet.core.navigation.AppNavigation
1615
import dagger.hilt.android.AndroidEntryPoint
16+
import timber.log.Timber
1717
import javax.inject.Inject
1818

1919
@AndroidEntryPoint
@@ -24,22 +24,30 @@ class MainActivity : ComponentActivity() {
2424
@Inject
2525
lateinit var coilManager: CoilManager
2626

27-
@SuppressLint("ObjectAnimatorBinding")
2827
override fun onCreate(savedInstanceState: Bundle?) {
28+
Timber.e("MainActivity onCreate")
2929
// 사용자가 설정한 SplashScreen 스타일을 기본으로 사용
30-
val splashScreen = installSplashScreen()
30+
// val splashScreen = installSplashScreen()
3131

3232
super.onCreate(savedInstanceState)
3333

3434
enableEdgeToEdge()
3535
setContent {
36+
val navController = rememberNavController()
3637
CompositionLocalProvider(LocalAuthManager provides authManager) {
3738
CompositionLocalProvider(LocalCoilManager provides coilManager) {
3839
LanPetAppTheme {
39-
AppNavigation()
40+
AppNavigation(
41+
navController = navController,
42+
)
4043
}
4144
}
4245
}
4346
}
4447
}
48+
49+
override fun onDestroy() {
50+
Timber.e("MainActivity onDestroy")
51+
super.onDestroy()
52+
}
4553
}

core/auth/src/main/java/com/lanpet/core/auth/AuthManager.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,14 @@ open class AuthManager
369369
)
370370
}
371371

372+
fun finish() {
373+
authStateHolder.updateState(
374+
AuthState.Loading(
375+
null,
376+
),
377+
)
378+
}
379+
372380
companion object {
373381
val accessTokenKey = stringPreferencesKey("accessToken")
374382
val refreshTokenKey = stringPreferencesKey("refreshToken")

core/common/src/main/java/com/lanpet/core/common/widget/LanPetBottomNavItem.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ import androidx.compose.ui.unit.dp
2525
import com.lanpet.core.designsystem.R
2626
import com.lanpet.core.designsystem.theme.LanPetAppTheme
2727
import com.lanpet.core.designsystem.theme.customColorScheme
28+
import kotlinx.serialization.Serializable
2829

30+
@Serializable
2931
enum class BottomNavItem(
3032
val title: String,
3133
val selectedIcon: Int,

core/navigation/src/main/java/com/lanpet/core/navigation/AppNavigation.kt

Lines changed: 98 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package com.lanpet.core.navigation
22

3+
import android.annotation.SuppressLint
4+
import android.app.Activity
5+
import android.os.Bundle
6+
import androidx.activity.compose.BackHandler
37
import androidx.compose.animation.AnimatedVisibility
48
import androidx.compose.animation.core.FastOutSlowInEasing
59
import androidx.compose.animation.core.tween
@@ -9,22 +13,29 @@ import androidx.compose.foundation.layout.Box
913
import androidx.compose.foundation.layout.Column
1014
import androidx.compose.foundation.layout.fillMaxSize
1115
import androidx.compose.runtime.Composable
16+
import androidx.compose.runtime.DisposableEffect
1217
import androidx.compose.runtime.LaunchedEffect
13-
import androidx.compose.runtime.collectAsState
1418
import androidx.compose.runtime.getValue
1519
import androidx.compose.runtime.mutableStateOf
1620
import androidx.compose.runtime.remember
1721
import androidx.compose.runtime.saveable.rememberSaveable
1822
import androidx.compose.runtime.setValue
19-
import androidx.compose.runtime.snapshotFlow
2023
import androidx.compose.ui.Alignment
2124
import androidx.compose.ui.Modifier
25+
import androidx.compose.ui.platform.LocalContext
26+
import androidx.lifecycle.compose.collectAsStateWithLifecycle
27+
import androidx.navigation.NavController
28+
import androidx.navigation.NavDestination
29+
import androidx.navigation.NavGraph.Companion.findStartDestination
30+
import androidx.navigation.NavHostController
31+
import androidx.navigation.NavOptions
2232
import androidx.navigation.compose.NavHost
2333
import androidx.navigation.compose.composable
2434
import androidx.navigation.compose.currentBackStackEntryAsState
25-
import androidx.navigation.compose.navigation
2635
import androidx.navigation.compose.rememberNavController
2736
import androidx.navigation.navOptions
37+
import androidx.navigation.navigation
38+
import com.lanpet.core.auth.BuildConfig
2839
import com.lanpet.core.auth.LocalAuthManager
2940
import com.lanpet.core.common.widget.BottomNavItem
3041
import com.lanpet.core.common.widget.LanPetBottomNavBar
@@ -70,16 +81,26 @@ import com.lanpet.profile.navigation.profileNavGraph
7081
import com.lanpet.wiki.navigation.Wiki
7182
import com.lanpet.wiki.navigation.navigateToWikiBaseRoute
7283
import com.lanpet.wiki.navigation.wikiNavGraph
73-
import kotlinx.coroutines.flow.distinctUntilChanged
74-
import kotlinx.coroutines.flow.drop
7584
import timber.log.Timber
7685

7786
@Composable
78-
fun AppNavigation(modifier: Modifier = Modifier) {
79-
val navController = rememberNavController()
87+
fun AppNavigation(
88+
modifier: Modifier = Modifier,
89+
navController: NavHostController = rememberNavController(),
90+
) {
91+
val context = LocalContext.current
8092
val authManager = LocalAuthManager.current
8193

82-
val authState = authManager.authState.collectAsState()
94+
BackHandler {
95+
authManager.finish()
96+
(context as Activity).finishAffinity()
97+
}
98+
99+
if (BuildConfig.BUILD_TYPE == "debug") {
100+
DestinationLoggerHandler(navController)
101+
}
102+
103+
val authState = authManager.authState.collectAsStateWithLifecycle()
83104

84105
// Handling navigation by AuthState
85106
rememberNavigationHandler(navController, authState.value)
@@ -91,7 +112,7 @@ fun AppNavigation(modifier: Modifier = Modifier) {
91112
}
92113

93114
var navItem by rememberSaveable {
94-
mutableStateOf(BottomNavItem.Wiki)
115+
mutableStateOf<BottomNavItem?>(null)
95116
}
96117

97118
Box {
@@ -135,7 +156,11 @@ fun AppNavigation(modifier: Modifier = Modifier) {
135156
onNavigateToHumanAge = { navController.navigateToProfileCreateHumanAge() },
136157
onNavigateToDone = { navController.navigateToProfileCreateDone() },
137158
onNavigateToPreferPet = { navController.navigateToProfileCreatePreferPet() },
138-
onNavigateToMain = { navController.navigateToMainScreen() },
159+
onNavigateToMain = {
160+
navController.navigateToMainScreen(
161+
idRes = navController.graph.findStartDestination().id,
162+
)
163+
},
139164
navController = navController,
140165
)
141166

@@ -251,19 +276,41 @@ fun AppNavigation(modifier: Modifier = Modifier) {
251276
),
252277
),
253278
) {
254-
LanPetBottomNavBar(
255-
selectedBottomNavItem = navItem,
256-
bottomNavItemList =
257-
listOf(
258-
BottomNavItem.Wiki,
259-
BottomNavItem.Free,
260-
BottomNavItem.MyPage,
261-
),
262-
onItemSelect = { item ->
263-
Timber.d("selected bottom nav item: $item")
264-
navItem = item
265-
},
266-
)
279+
if (navItem != null) {
280+
LanPetBottomNavBar(
281+
selectedBottomNavItem = navItem!!,
282+
bottomNavItemList =
283+
listOf(
284+
BottomNavItem.Wiki,
285+
BottomNavItem.Free,
286+
BottomNavItem.MyPage,
287+
),
288+
onItemSelect = { item ->
289+
Timber.d("selected bottom nav item: $item")
290+
navItem = item
291+
292+
when (item) {
293+
BottomNavItem.Wiki -> {
294+
navController.navigateToWikiBaseRoute(
295+
topLevelDestinationNavOptions(),
296+
)
297+
}
298+
299+
BottomNavItem.Free -> {
300+
navController.navigateToFreeBoardBaseRoute(
301+
topLevelDestinationNavOptions(),
302+
)
303+
}
304+
305+
BottomNavItem.MyPage -> {
306+
navController.navigateToMyProfileBaseRoute(
307+
topLevelDestinationNavOptions(),
308+
)
309+
}
310+
}
311+
},
312+
)
313+
}
267314
}
268315
}
269316

@@ -286,43 +333,41 @@ fun AppNavigation(modifier: Modifier = Modifier) {
286333
true
287334
}
288335

289-
toString(),
290-
-> true
291-
292336
else -> false
293337
}
294338
}
339+
}
295340

296-
val topLevelDestinationNavOptions =
297-
navOptions {
298-
popUpTo(MainNavigationRoute(BottomNavItem.Wiki)) {
299-
saveState = true
300-
}
301-
302-
launchSingleTop = true
303-
restoreState = true
341+
private fun topLevelDestinationNavOptions(): NavOptions =
342+
navOptions {
343+
popUpTo(MainNavigationRoute) {
344+
saveState = true
345+
inclusive = true
304346
}
305347

306-
// BottomNav의 item이 변경되면 해당 item에 맞는 화면으로 이동
307-
LaunchedEffect(Unit) {
308-
snapshotFlow { navItem }
309-
.distinctUntilChanged()
310-
.drop(1) // 초기 값은 스킵
311-
.collect { newValue ->
312-
// value가 변경될 때만 실행되는 로직
313-
when (newValue) {
314-
BottomNavItem.Wiki -> {
315-
navController.navigateToWikiBaseRoute(topLevelDestinationNavOptions)
316-
}
348+
launchSingleTop = true
349+
restoreState = true
350+
}
317351

318-
BottomNavItem.Free -> {
319-
navController.navigateToFreeBoardBaseRoute(topLevelDestinationNavOptions)
320-
}
352+
@Composable
353+
private fun DestinationLoggerHandler(navController: NavHostController) {
354+
@SuppressLint("RestrictedApi")
355+
val destinationChangedListener: (NavController, NavDestination, Bundle?) -> Unit =
356+
{ controller, _, _ ->
357+
val stack =
358+
controller.currentBackStack.value
321359

322-
BottomNavItem.MyPage -> {
323-
navController.navigateToMyProfileBaseRoute(topLevelDestinationNavOptions)
324-
}
325-
}
326-
}
360+
// 각 항목을 "->"로 구분하여 보기 좋게 출력
361+
val stackLog = stack.joinToString("\n") { " $${it.destination.id}" }
362+
Timber.i("previousBackStackEntry: ${controller.previousBackStackEntry}\n")
363+
Timber.i("currentBackStackEntry: ${controller.currentBackStackEntry}\n")
364+
Timber.d("Navigation Stack:\n====================\n$stackLog\n====================")
365+
}
366+
367+
DisposableEffect(Unit) {
368+
navController.addOnDestinationChangedListener(destinationChangedListener)
369+
onDispose {
370+
navController.removeOnDestinationChangedListener(destinationChangedListener)
371+
}
327372
}
328373
}

0 commit comments

Comments
 (0)