要在 Android Jetpack Compose 中实现导航,需要在 build.gradle 中导入以下依赖:
implementation "androidx.navigation:navigation-compose:2.4.0-alpha01"
然后在代码中使用 Navigation 控件:
import androidx.compose.runtime.mutableStateOf
import androidx.navigation.NavHostController
import androidx.navigation.NavType
import androidx.navigation.compose.*
import com.example.compose.*
@Composable
fun MyApp() {
val navController = rememberNavController()
NavHost(
navController = navController,
startDestination = "home"
) {
composable("home") { HomeScreen(navController) }
composable(
"details/{itemId}",
arguments = listOf(
navArgument("itemId") { type = NavType.IntType }
)
) { backStackEntry ->
val itemId = backStackEntry.arguments?.getInt("itemId")
DetailsScreen(navController = navController, itemId = itemId ?: 0)
}
}
}
@Composable
fun HomeScreen(navController: NavHostController) {
// ...
}
@Composable
fun DetailsScreen(navController: NavHostController, itemId: Int) {
// ...
}
其中 navController
对象是用于控制导航的核心组件。在 MyApp
中创建 NavHost
,并在其中使用 composable
函数来注册页面,比如在本例中注册了两个页面:HomeScreen
和 DetailsScreen
,分别对应着路径 home
和 details/{itemId}
。注意,details/{itemId}
中花括号中的内容表示参数,必须先在 arguments
中声明参数类型,并在实际使用时传入参数值。
在 HomeScreen
和 DetailsScreen
中可以使用 navController
对象进行导航。比如,在 HomeScreen
中可以使用 navController.navigate("details/123")
来导航到 DetailsScreen
,并且将参数 itemId 设置为 123。再比如,在 DetailsScreen
中可以使用 navController.navigateUp()