
前言
上一篇文章我们说了食选这个程序的开发原因和架构设计。我们简单的讲了下依赖注入是如何搭配到Room和数据源的。这节我们就来讲一下如何把各个模块组合起来,先构成一个携带导航的APP首页,当有了首页后我们再试着从它的基础上进行开发。
业务需求
- 界面管理处理
- MVI实现
- 界面设计
业务实现
下面内容建议参考源代码阅读,粘贴的代码不是很多
1250422131/FoodChoice: 食选,解决生活中每天吃饭,吃什么,做什么,怎么做的问题,此项目也是我对JetpackCompose的MVI架构学习的一次实践。 (github.com)
界面管理
还记得吗?我们想试着用累个activity来展示基本所有的compose界面,这就意味着我们需要自己去管理compose的出入栈,因为activity只有一个,我们不能靠安卓自己来做出入栈了。
当然这里我不太确定这样做是否合理,但是我们采用了模块化,使用activity来对应各个界面就不太方便了。我们在上一篇已经提及了这个问题,就是下面这个库,这是谷歌提供用来管理compose界面的一个库,用起来也比较好使。
使用 Compose 进行导航 | Jetpack Compose | Android Developers (google.cn)
让我们看看它是简单使用,我们在app模块的navigation下建立了FCNavHost.kt
,这里就是路由导航管理,类似vue
里的路由管理。
@Composable
fun FCNavHost(
navController: NavHostController,
modifier: Modifier = Modifier,
startDestination: String = "app_home",
) {
NavHost(
navController = navController,
startDestination = startDestination,
modifier = modifier,
) {
composable(homeRoute) {
HomeRoute(modifier = modifier, navController = navController)
}
composable(cookRoute) {
CookRoute(modifier = modifier, navController = navController)
}
composable(settingRoute) {
SettingRoute(modifier = modifier, navController = navController)
}
}
}
我们现在可以看到,这个方法对NavHost
进行了封装,这里面已经有3个界面了,里边的一个composable
就相当于一个界面,我们可以看到都调用了一些顶层方法比如 HomeRoute,那就是首页的。
但是我们发现composable
有一个参数,那便是这个界面的路由地址,同理NavHost
的startDestination,就是初始路由。
讲解完后,假如从0开始,那么我们得到的代码应该是这样的。
@Composable
fun FCNavHost(
navController: NavHostController,
modifier: Modifier = Modifier,
startDestination: String = "",
) {
NavHost(
navController = navController,
startDestination = startDestination,
modifier = modifier,
) {
}
}
OK,我们先把他放在一旁,因为待会才要使用它。
为MVI提供Base类
我们前面的文章提到了一些MVI的概念,但仅此而已,下面我们需要为每个界面都实现这样的能力,因此我们就要做一个基类,让其他compose的ViewModel
都继承它。
让我们回忆一下,UI
,绑定ViewModel
,并且利用其中的state
对象来驱动界面展示数据,当用户作出交互时UI
向ViewModel
发送一个意图,而ViewModel
收到后修改了其中的State
对象,造成UI的刷新,又因为State
内的值发生改变,所以才引起了UI
的变化。