文章目录
- 一、前言
- 二、使用判断条件进行显示隐藏和Navigation的区别
- 三、Navigation和ViewModel的关系
- 四、Navigation中替换页面的方式
一、前言
在Android的项目架构中有一种由单个Activity
,多个页面组成的架构。页面之前是由Fragment
来承载显示,现在可以使用Compose
来承载显示。在Compose中进行页面跳转切换除了使用判断条件进行显示隐藏外,使用Navigation
能更好的对项目进行拓展维护。
二、使用判断条件进行显示隐藏和Navigation的区别
大部分项目应该还是使用Activity
或者Fragment
进行承载Compose
页面。有时候单个页面中有不同的状态比如有数据状态或者无数据状态的UI的话,可以使用条件判断进行能显示隐藏。假如想将多个复杂页面放在一个Activity
中。比如登录功能中的登录、注册等页面,那么使用判断来做会显得过于耦合。使用Navigation
的话就能很好的解耦。每个页面都有自己的示例,算是另一个版本的Fragment
三、Navigation和ViewModel的关系
如果使用Navigation
进行UI显示的话,那么除非每一个页面的ViewModel是由外部生成传递进来的,那么每一个Navigation
页面之间的ViewModel
实例都是一个单独的实例。例如以下示例:
@Compose
fun Root(){NavHost(modifier = modifier,navController = navController,startDestination = firstRoute) {composable(firstRoute) {FirstPage().FirstRoot()}composable(route = secondRoute,) {SecondPage().SecondRoot()}}
}class FirstPage {@Preview(showBackground = true, showSystemUi = true)@Composablefun FirstRoot(viewModel: MainViewModel = viewModel()){Box(modifier = Modifier.fillMaxSize(),){TextButton() {Text(text = "第一个页面")}}}
}class SecondPage {@Preview(showBackground = true, showSystemUi = true)@Composablefun SecondRoot(viewModel: MainViewModel = viewModel()){Box(modifier = Modifier.fillMaxSize(),){TextButton() {Text(text = "第二个页面")}}}
}
如上文所述,两个页面之间的ViewModel之间的数据是不互通的。除非从外部传入,或者有一个公共的地方保存同一个ViewModel示例
四、Navigation中替换页面的方式
Navigation
默认会对切换的页面保存在一个堆栈里面,假如按返回键的话会回退的上一个页面。但是假如某个Activity进去后会根据状态不同显示某个页面,比如先进去的时候有数据,网络不好了,切换到无数据UI,这时候是不能回退到上个页面的,有两种方式一种就是拦截返回操作,第二个就是跳转过来时候清空堆栈。示例代码如下
//第一种
navController.navigate(secondRoute){popUpTo(navController.graph.startDestinationId) {inclusive = true // 包含起始目标在内的所有目标}
}
//第二种
navController.navigate(secondRoute){popUpTo(navController.graph.id) {inclusive = true // 包含起始目标在内的所有目标}
}