Compose 打造一个Home页面

一般的APP首页都是由多个Tab组成。在Compose中,要实现这个会变得异常的简单,这个得益于Compose自带的组合函数功能。下面是轻松打造一个Home页面的过程。

BottomNavigationView的实现

由于Compose布局的组合化的灵活。这里直接实现一个 Image +Text的Tab,通过遍历数组进行生成即可。拆分步骤如下:

  1. 一个横向布局,嵌套多个竖向Tab
  2. Tab具备的信息:图片(选中和未选中)、文本
  3. 每一个Tab点击的回调:tag->Unit

模型

data class TabModel(val tagTag: String,val tabName: Int,val normalIcon: Int,val selectedIcon: Int
)

主体代码

@Preview(showBackground = true)
@Composable
fun TabView(@PreviewParameter(TabDataSourceMock::class) tabSource: Array<TabModel>,tagCallback: ((String) -> Unit)?
) {Row(modifier = Modifier.fillMaxWidth().shadow(4.dp, RectangleShape, false).wrapContentHeight(Alignment.CenterVertically).background(Color.White)) {val imageModifier = Modifier.padding(0.dp, 8.dp, 0.dp, 0.dp)val tabModifier = Modifier.padding(0.dp, 0.dp, 0.dp, 5.dp)val selectIndex = rememberSaveable {mutableStateOf(0)}tabSource.forEachIndexed { index, currentModel ->Column(modifier = Modifier.weight(1F, true).clickable {selectIndex.value = indextagCallback?.invoke(currentModel.tagTag)},horizontalAlignment = Alignment.CenterHorizontally,verticalArrangement = Arrangement.Center,) {Image(painter = if (index == selectIndex.value) painterResource(id = currentModel.selectedIcon) elsepainterResource(id = currentModel.normalIcon),contentDescription = stringResource(id = currentModel.tabName),modifier = imageModifier)Text(stringResource(id = currentModel.tabName),modifier = tabModifier,textAlign = TextAlign.Center,fontSize = 12.sp,color = if (index == selectIndex.value) Color(0xFF07C160) else Color(0xFFAFB2B0),)}}}
}

模拟数据

class TabDataSourceMock : PreviewParameterProvider<Array<TabModel>> {override val values: Sequence<Array<TabModel>>get() = listOf<Array<TabModel>>(tabDataAll(),tabDataWithoutMall()).asSequence()
}fun tabDataAll(): Array<TabModel> {return arrayOf<TabModel>(TabModel(TabTags.TAG_HOME,R.string.tab_home,R.drawable.icon_home_normal,R.drawable.icon_home_selected),TabModel(TabTags.TAG_SMART,R.string.tab_smart,R.drawable.icon_smart_normal,R.drawable.icon_smart_selected),TabModel(TabTags.TAG_MALL,R.string.tab_mall,R.drawable.icon_mall_normal,R.drawable.icon_mall_selected),TabModel(TabTags.TAG_MORE,R.string.tab_more,R.drawable.icon_me_normal,R.drawable.icon_me_selected))
}fun tabDataWithoutMall(): Array<TabModel> {return arrayOf<TabModel>(TabModel(TabTags.TAG_HOME,R.string.tab_home,R.drawable.icon_home_normal,R.drawable.icon_home_selected),TabModel(TabTags.TAG_SMART,R.string.tab_smart,R.drawable.icon_smart_normal,R.drawable.icon_smart_selected),TabModel(TabTags.TAG_MORE,R.string.tab_more,R.drawable.icon_me_normal,R.drawable.icon_me_selected))
}
class TabTags {companion object {const val TAG_HOME = "home"const val TAG_SMART = "smart"const val TAG_MALL = "mall"const val TAG_MORE = "more"}
}

预览如下

这里为什么有两个预览呢?主要是在模拟函数返回了两个source。

开发中遇到的问题

资源引用

  1. 引用字符串 stringResource(id = currentModel.tabName)
  2. 引用图片资源 painterResource(id = currentModel.selectedIcon)

预览函数

PreviewParameterProvider<Array<TabModel>> 这个函数正确使用方式如下

@Preview(showBackground = true)
@Composable
fun TabView(@PreviewParameter(TabDataSourceMock::class) tabSource: Array<TabModel>,tagCallback: ((String) -> Unit)?
)

模型抽象的错误

开始时,我对TabModel的抽象是直接使用了 Painter 导致了一个错误 Functions which invoke @Composable functions must be marked with the @Composable annotation
这个错误已经非常明显,所以不能在非@Composable 函数下。尽可能抽象出不依赖Compose的model。

Compose的便捷

通过这个简单的例子发现。

  1. 简约到极致。 Compose的便捷不单单在简约,而且特别省时间,开发效率可以说是翻了好几倍。你想想,如果之前要实现这个,你要多少的封装,可能还要使用到Fragment的管理。真不敢想象。
  2. 依赖减少。 开发这个首页居然可以0依赖,没有什么第三方控件的引入,也没有去找控件的烦恼。这里需要注意的是,很多人担心Compose没有那么多开源框架,其实这个担心是多余的。因为Compose简化了布局的实现,已经不需要那些什么约束布局和线性布局的思路了,也不需要什么UI库,万物皆组合。

Compose 打造一个Home页面相关推荐

  1. (实战)Vue + Koa从零打造一个H5页面可视化编辑器——Quark-h5

    作者:围的围 https://juejin.im/post/5dc81428e51d4523632ee793 前言 想必你一定使用过易企秀或百度H5等微场景生成工具制作过炫酷的h5页面,除了感叹其神奇 ...

  2. Vue + element从零打造一个H5页面可视化编辑器——pl-drag-template

    pl-drag-template Github地址:https://github.com/livelyPeng/pl-drag-template 前言 想必你一定使用过易企秀或百度H5等微场景生成工具 ...

  3. 用Jetpack Compose做一个俄罗斯方块游戏机

    本文介绍如何使用Jetpack Compose打造一个经典版的俄罗斯方块游戏. 玩过上面这种游戏机的朋友应该会对本文内容感到亲切,废话不多说,先看东西: 1. 为什么Compose适合做游戏? 通常一 ...

  4. bootstrap设计登录页面_前端小白如何在10分钟内打造一个爆款Web响应式登录界面?...

    对于前端小白(例如:专注后端代码N年的攻城狮),自己编写一个漂亮的Web登录页面似乎在设计上有些捉襟见肘,不懂UI设计,颜色搭配极度的混乱(主色,辅助色,配色,色彩渐变,动画效果等等,看起来一堆乱七八 ...

  5. Compose 正式发布,来打造一个 Flappy Bird! | 开发者说·DTalk

    本文原作者: 小虾米君,原文发布于: TechMerger https://mp.weixin.qq.com/s/Hpd2NF0hOw4xOo3wVb_VFg 之前看到 fun 神用 Compose ...

  6. vue.js+socket.io打造一个好玩的新闻社区

    title: Socket.io+vue打造新闻社区 date: 2017-06-12 20:19:05 tags: [vue.js,javascript,socket.io] vue2.0 + so ...

  7. 使用CSS3悬停效果打造不同的页面版式

    CSS3 为 Web 开发带来了非常令人兴奋的变化,特别是 CSS 3D 转换.动画等特性的支持,可以轻松的创建很酷的 Web 效果. CSS3新增添了实现动画效果的新功能,通过本文,你可以对这些新功 ...

  8. mysql 分词搜索_打造一个蓝奏云网盘搜索引擎

    目前存在的网盘搜索引擎好多,可以归于两类: 1.搜索引擎索引 2.爬虫入库索引 第一种:搜索引擎索引 这种索引方式是目前比较主流的方式,依靠百度,谷歌建立索引链接,当用户进行搜索的时候,网盘搜索引擎会 ...

  9. 使用jquery打造一个动态的预览产品颜色效果

    在浏览一些电子商务网站的时候,选择一件产品的时候,我们经常会看到点击衣服的颜色,同一件衣服的颜色就会切换,让我们觉得真是比较有意思,这样做的效果给用户的体验比较好,今天就给大家分享一下这种效果的实现原 ...

最新文章

  1. 尺度不变特征变换匹配算法详解
  2. NCEPU:线下组队学习周报(007)
  3. jquery-migrate.js
  4. linux系统的交换分区怎么分配?
  5. google protobuf安装与使用
  6. mysql 禁止插入重复数据_防止MySQL重复插入数据的三种方法
  7. Spark笔记:复杂RDD的API的理解(下)
  8. html 按钮防止多次提交,HTML点击提交按钮两次
  9. 多线程——线程间的同步通信
  10. 70多个国家地区免费享受wifi
  11. 开源 YDB 数据库
  12. Web — 调色盘打开+div
  13. .net 跳出Frameset框架
  14. bp神经网络模型拓扑结构,bp神经网络模型结构图
  15. 委托租赁云服务器协议,委托租赁云服务器协议
  16. 微型计算机数码管显示实验,微机原理实验八段数码管显示.doc
  17. jzoj2555 雾雨魔理沙
  18. 使用WGCLOUD来统计用户日活周活月活
  19. Spring Boot+Vue/前后端分离/高并发/秒杀实战课程之spring Security快速搭建oauth2 内存版身份认证
  20. 在微信公众号中添加外部的链接图文教程

热门文章

  1. 我们在淘宝京东拼多多买东西时,有哪些价格歧视?
  2. 解决Virtual Box(vbox)虚拟机无法和主机复制粘贴拖放
  3. win7 64位安装vs code
  4. java类初始数组_java中数组初始化的三种方式是什么
  5. SAP S4HANA MM模块后台配置详解
  6. sum=sum+a;关于此的初级解读
  7. Android sqlite数据库操作通用框架AHibernate(三)-升级为1.1版本
  8. python使用pymodbus库进行modbus tcp通信
  9. 多方支援湖北,AI医生已出动,我们能做些什么?
  10. win7不想更新win10也会下载win10安装包,而且有时会自动更新