說明

在 UserMainScreen (route 名稱為 user_main) 的文字方塊中輸入姓名,按下按鈕後,傳給 UserDetailScreen。

UserDetailScreen (route 名稱為 user_detail) 接受姓名參數,在畫面中顯示資料。

程式碼

第一個畫面: UserMainScreen (user_main)

在 NavGraph 的部分,沒什麼需要注意的地方

composable(
    route="user_main",
) { 
    UserMainScreen(
        navController = navController,
    )
}

在 Composable 的部分,要注意 Button 的 onClick ,其所用類似 URL 的表示方式

反斜線表示為必要欄位,問號則表示為非必要欄位

@Composable
fun UserMainScreen(
    navController: NavHostController,
) {
    Column(
        modifier = Modifier.padding(50.dp),
    ) {
        var text by remember {
            mutableStateOf("")
        }

        Text(text = "User Main Screen")
        TextField(
            value = text,
            onValueChange = {
                text = it
            },
        )
        Spacer(modifier = Modifier.height(16.dp))
        Button(
            onClick = {
                // 以類似 URL 的方式傳遞資料
                navController.navigate("user_detail/$text")
            }
        ) {
            Text(text = "To User Detail Screen")
        }
    }
}

第二個畫面:UserDetailScreen (user_detail)

NavGraph 的部分,有比較多東西要注意

composable(
    route="user_detail" + "/{name}",
    arguments = listOf(
        navArgument("name") {
            type = NavType.StringType
            defaultValue = "Steve"
            nullable = true
        }
    )
) { entry ->
    UserDetailScreen(
        name = entry.arguments?.getString("name")
    )
}

Composable 的部分,只要注意傳入的參數即可

@Composable
fun UserDetailScreen(
    name: String?
) {
    Column(
        modifier = Modifier.padding(50.dp)
    ) {
        Text(text = "Hello, $name")
    }
}

完整程式碼

build.gradle.kt (Module level: app)

...
dependencies {

    ...

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

}

UserScreens.kt

@Composable
fun UserMainScreen(
    navController: NavHostController,
) {
    Column(
        modifier = Modifier.padding(50.dp),
    ) {
        var text by remember {
            mutableStateOf("")
        }

        Text(text = "User Main Screen")
        TextField(
            value = text,
            onValueChange = {
                text = it
            },
        )
        Spacer(modifier = Modifier.height(16.dp))
        Button(
            onClick = {
                navController.navigate("user_detail/$text")
            }
        ) {
            Text(text = "To User Detail Screen")
        }
    }
}

@Composable
fun UserDetailScreen(
    name: String?
) {
    Column(
        modifier = Modifier.padding(50.dp)
    ) {
        Text(text = "Hello, $name")
    }
}

MainActivity.kt

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

                NavHost(
                    navController = navController,
                    startDestination = "user_main",
                    modifier = Modifier
                ) {
                    userGraph(navController)
                }
            }
        }
    }
}

fun NavGraphBuilder.userGraph(
    navController: NavHostController
) {
    composable(
        route="user_main",
    ) { entry ->
        UserMainScreen(
            navController = navController,
        )
    }
    composable(
        route="user_detail" + "/{name}",
        arguments = listOf(
            navArgument("name") {
                type = NavType.StringType
                defaultValue = "Steve"
                nullable = true
            }
        )
    ) { entry ->
        UserDetailScreen(
            name = entry.arguments?.getString("name")
        )
    }
}
Last modified: 2025 年 6 月 27 日

Author

Comments

Write a Reply or Comment

Your email address will not be published.