Administrator
Administrator
Published on 2025-03-13 / 15 Visits
0
0

navigation(页面路由)

依赖项网页:https://developer.android.com/jetpack/androidx/releases/navigation?hl=zh-cn#declaring_dependencies

引入依赖

dependencies {
  val nav_version = "2.8.8" //稳定版本
  implementation("androidx.navigation:navigation-compose:$nav_version")// Views/Fragments integration
  implementation("androidx.navigation:navigation-fragment:$nav_version")
  implementation("androidx.navigation:navigation-ui:$nav_version")// Feature module support for Fragments
  implementation("androidx.navigation:navigation-dynamic-features-fragment:$nav_version")// Testing Navigation
  androidTestImplementation("androidx.navigation:navigation-testing:$nav_version")
}

以上使用Kotlin DSL,修改build.gradle.kts后点Sync Now

Use

val localNavController = compositionLocalOf <NavController> { error("No NavController found!") }
class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContent {
            NavtestTheme {
                val navController = rememberNavController()
                CompositionLocalProvider(localNavController provides navController) {
                    NavHost(navController = navController, startDestination = "home", /*不使用页面切换时的动画效果*/
                    enterTransition = {
                        EnterTransition.None
                    }, exitTransition = {
                        ExitTransition.None
                    }, popEnterTransition = {
                        EnterTransition.None
                    }) {
                        composable("home") {
                            HomeScreen()
                        }
                        composable("profile/{p1}/{p2}") { backStackEntry ->
                            // 页面路由参数,在跳转到此页面时的方式:
                            // nav.navigate("profile/1/2")
                            val p1 = backStackEntry.arguments?.getString("p1")
                            val p2 = backStackEntry.arguments?.getString("p2")
                            ProfileScreen()
                        }
                        dialog("profile") {
                            //以模态弹窗的形式显示页面
                            ProfileScreen()
                        }
                        composable("login") {
                            Login()
                        }
                    }
                }
            }
        }
    }
}

@Composable
fun ProfileScreen() {
//在任意页面中用localNavController获取NavController实例
    val nav = localNavController.current
    nav.navigate("login")
}


Comment