App 架構

程式碼範例 – 基本用法

build.gradle.kt (Module level: app)

...
dependencies {

    ...

    implementation("androidx.navigation:navigation-compose:2.9.0")

}

AuthScreens.kt

這個檔案放了我們會用到的 3 個 Screen

@Composable
fun IntroScreen(
    onLoginClick: () -> Unit,
    onRegisterClick:  () -> Unit,
) {
    Column(
        modifier = Modifier.padding(50.dp),
    ) {
        Text(text = "Intro Screen")
        Button(
            onClick = onLoginClick
        ) {
            Text(text = "Login")
        }
        Button(
            onClick = onRegisterClick
        ) {
            Text(text = "Register")
        }
    }
}

@Composable
fun RegisterScreen() {
    Column(
        modifier = Modifier.padding(50.dp)
    ) {
        Text(text = "Register Screen")
    }
}

@Composable
fun LoginScreen() {
    Column(
        modifier = Modifier.padding(50.dp)
    ) {
        Text(text = "Login Screen")
    }
}

MainActivity.kt

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContent {
            NavigationLab1Theme {
                val navController = rememberNavController()

                NavHost(
                    navController = navController,
                    startDestination = "intro",
                    modifier = Modifier
                ) {
                    composable(route="intro") {
                        IntroScreen(
                            onLoginClick = {
                                navController.navigate("login")
                            },
                            onRegisterClick = {
                                navController.navigate("register")
                            }
                        )
                    }
                    composable(route="register") {
                        RegisterScreen()
                    }
                    composable(route="login") {
                        LoginScreen()
                    } 
                    
                }
            }
        }
    }
}

程式碼範例 – 重構:將 NavGraph 萃取出來

我們將以上三個 Screen 歸類為 auth 功能,然後建立一個 authGraph,讓整個程式碼更為簡單易懂。

MainActivity

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContent {
            NavigationLab1Theme {
                val navController = rememberNavController()

                NavHost(
                    navController = navController,
                    startDestination = "intro",
                    modifier = Modifier
                ) {
                    authGraph(navController)
                }
            }
        }
    }
}

fun NavGraphBuilder.authGraph(
    navController: NavHostController
) {
    composable(route="intro") {
        IntroScreen(
            onLoginClick = {
                navController.navigate("login")
            },
            onRegisterClick = {
                navController.navigate("register")
            }
        )
    }
    composable(route="register") {
        RegisterScreen()
    }
    composable(route="login") {
        LoginScreen()
    }
}
Last modified: 2025 年 6 月 27 日

Author

Comments

Write a Reply or Comment

Your email address will not be published.