当前位置: 首页 > news >正文

Jetpack Compose 页面跳转 - 导航Navigation使用和封装

当我们在项目中使用Jetpack Compose进行页面编写的时候,在进行页面跳转时,官方推荐使用单Activity + 多Compose模式,当然老的多Activity方式仍能正常使用,只是Activity间的跳转消耗资源大,效率没有Compose间页面跳转的效率高,故推荐使用单Activity + 多Compose模式,本文主要介绍单Activity多Compose页面跳转的导航实现。

实现逻辑:

1、启动Activity时,显示Splash页面;

2、点击Splash页面按钮,跳转到Guide页面;

3、点击Guide页面按钮;返回Splash页面。

一、创建Splash页面

创建Splash页面,包含icon+版权文本,点击版权文本,将点击事件回传到上层进行逻辑处理。

SplashRoute.kt

/*年轻人,只管向前看,不要管自暴自弃者的话*/
package com.composetest.page.splashimport androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.composetest.R
import com.composetest.ui.theme.ComposeTestTheme/*** create by itz on 2024/10/10 15:59* desc :**/@Composable
fun SplashRoute(toGuide: () -> Unit) {SplashScreen(toGuide = toGuide)
}@Composable
fun SplashScreen(toGuide: () -> Unit = {}) {Box(modifier = Modifier.fillMaxSize().background(Color.White)) {Image(painter = painterResource(id = R.drawable.ic_launcher_background),contentDescription = null,modifier = Modifier.align(Alignment.Center).padding(bottom = 150.dp))Text(text = "版权号:2024",modifier = Modifier.align(Alignment.BottomCenter).padding(bottom = 30.dp).clickable { toGuide() },style = TextStyle(fontSize = 14.sp, color = Color.Gray))}
}@Preview
@Composable
fun SplashScreenPreview() {ComposeTestTheme {SplashScreen()}
}

二、创建Guide页面

创建Guide页面,包含back按钮,点击back按钮,将点击事件回传到上层进行逻辑处理。

GuideRoute.kt 

/*年轻人,只管向前看,不要管自暴自弃者的话*/
package com.composetest.page.guideimport androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import com.composetest.ui.theme.ComposeTestTheme/*** create by itz on 2024/10/11 11:47* desc :**/@Composable
fun GuideRoute(toBack:()->Unit): Unit {GuideScreen(toBack = toBack)
}@Composable
fun GuideScreen(toBack:()->Unit = {}): Unit {Box(modifier = Modifier.fillMaxSize()) {Button(onClick = toBack) {Text(text = "back")}}
}@Preview
@Composable
fun GuideScreenPreview() {ComposeTestTheme {GuideScreen()}
}

三、创建导航控制器

1、添加依赖

def nav_version = "2.5.0"
implementation "androidx.navigation:navigation-compose:$nav_version"

2、创建导航控制器 

创建MyApp函数,统一管理导航控制器,在NavHost配置 navController控制器、startDestination启动的默认页面splash、注册splash页面和guide页面的路由。

页面跳转:navController.navigate("guide")

页面关闭:navController.popBackStack()

MyApp.kt

/*年轻人,只管向前看,不要管自暴自弃者的话*/
package com.composetest.uiimport androidx.compose.runtime.Composable
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import com.composetest.page.guide.GuideRoute
import com.composetest.page.splash.SplashRoute/*** create by itz on 2024/10/11 10:24* desc :**/@Composable
fun MyApp(): Unit {val navController = rememberNavController()NavHost(navController = navController, startDestination = "splash") {composable("splash") {SplashRoute { navController.navigate("guide") }}composable("guide") {GuideRoute {navController.popBackStack()}}}
}

四、MainActivity使用

在MainActivity 使用MyApp函数,关联Compose编写的Splash页面到MainActivity

MainActivity.kt

class MainActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {ComposeTestTheme {MyApp()}}}
}

五、Navigation封装

1、扩展NavGraphBuilder.myComposable

扩展NavGraphBuilder.myComposable,实现composable,方便以后统一设置属性,如设置页面跳转动画样式等。

MyNavGraphBuilderKt.kt

/*年轻人,只管向前看,不要管自暴自弃者的话*/
package com.composetest.ui.navigationimport androidx.compose.runtime.Composable
import androidx.navigation.NamedNavArgument
import androidx.navigation.NavBackStackEntry
import androidx.navigation.NavDeepLink
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable/*** 配置路由** 方便以后统一设置*/
fun NavGraphBuilder.myComposable(route: String,arguments: List<NamedNavArgument> = emptyList(),deepLinks: List<NavDeepLink> = emptyList(),content: @Composable (NavBackStackEntry) -> Unit
): Unit {composable(route = route, arguments = arguments, deepLinks = deepLinks, content = content)
}

2、单独封装页面导航

1)Splash页面导航

SplashNavigation.kt

/*年轻人,只管向前看,不要管自暴自弃者的话*/
package com.composetest.page.splash.navigationimport androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import com.composetest.page.splash.SplashRoute
import com.composetest.ui.navigation.myComposableconst val SPLASH_ROUTE = "splash"/*** 跳转到splash*/
fun NavController.navigationToSplash(): Unit {navigate(SPLASH_ROUTE)
}/*** 配置导航*/
fun NavGraphBuilder.splashScreen(toGuide: () -> Unit): Unit {myComposable(SPLASH_ROUTE) {SplashRoute(toGuide = toGuide)}
}
2)Guide页面导航

GuideNavigation.kt

/*年轻人,只管向前看,不要管自暴自弃者的话*/
package com.composetest.page.guide.navigationimport androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import com.composetest.page.guide.GuideRoute
import com.composetest.ui.navigation.myComposableconst val GUIDE_ROUTE = "guide"/*** 跳转到guide*/
fun NavController.navigationToGuide(): Unit {navigate(GUIDE_ROUTE)
}/*** 配置导航*/
fun NavGraphBuilder.guideScreen(toBack: () -> Unit): Unit {myComposable(GUIDE_ROUTE) {GuideRoute(toBack = toBack)}
}

3、重写MyApp

导航配置 使用各页面扩展的导航配置方法。

MyApp.kt

/*年轻人,只管向前看,不要管自暴自弃者的话*/
package com.composetest.uiimport androidx.compose.runtime.Composable
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.rememberNavController
import com.composetest.page.guide.navigation.guideScreen
import com.composetest.page.guide.navigation.navigationToGuide
import com.composetest.page.splash.navigation.SPLASH_ROUTE
import com.composetest.page.splash.navigation.splashScreen/*** create by itz on 2024/10/11 10:24* desc :**/@Composable
fun MyApp(): Unit {val navController = rememberNavController()NavHost(navController = navController, startDestination = SPLASH_ROUTE) {splashScreen(toGuide = navController::navigationToGuide)guideScreen(toBack = navController::popBackStack)}
}

至此实现了Jetpack Compose 页面跳转导航Navigation使用和封装。


http://www.mrgr.cn/news/47843.html

相关文章:

  • 如何在组织内推广和应用六西格玛设计?
  • 双十一买什么东西好?五大双11好物推荐分享!
  • LangChain 学习(三)
  • 【python】函数的返回值
  • 魔珐出席INSIGHT金融洞察力峰会,共探AI内容生成新范式
  • 【Lua学习】字符串string和字符串标准库
  • 【C++】List
  • linux红帽
  • 数据治理:制造企业转型的关键要素与战略需求
  • <<迷雾>> 第10章 用机器做一连串的加法(7)--装载数据的过程及相加过程 示例电路
  • Android GPIO方式解码红外数据
  • deepin20.9安装部署 |deepin20.9镜像下载 |基本命令 |手动分区 |开启远程ssh服务
  • 京东/美团/TCL/中软技术岗热招:经验不限,大专可投,薪资最高35K!
  • 第二阶段:mysql(学完就隐藏版)
  • 千兆超薄lan transformer H82412S应用主板英特尔光仟网卡
  • Ansible自动化运维实践:从入门到进阶
  • 一键生成二维码的源码系统 电脑+手机版自适应代码 带完整的安装代码包以及搭建部署教程
  • 【储能优化】使用优化的微电网能源管理系统 (EMS)
  • 如何寻找和使用低代码工具生成源码?蓝燕云低代码源码!
  • 《OpenCV》—— 指纹验证