为了账号安全,请及时绑定邮箱和手机立即绑定

Jetpack Compose 踩坑记录

标签:
Java Android

为了防止每次掉进同一个坑,做一下记录:

  1. Compose没办法做加法 Compose只能做加法 

    我有一个OutlinedButton,也就是带边框线的按钮。我希望把这个按钮的边框线去掉,于是设置了border=0.dp。

    然而没用,怎么设置Button都不变。睡了一觉才想明白:

    Compose里面,设置属性的顺序会影响最终的视图渲染,也就是说新设置的属性并不会覆盖掉原本的属性,没办法通过添加属性来强行改变一个控件,所以说没办法做加法。

    设置过一次border=1.dp以后,无论后面再怎么设置border,原来的1.dp的设置都不会消失。但是如果设置成border=2.dp的话,边框确实会加粗。感觉就好像代码写下去的那一刻,边框就已经渲染好了一样,没办法再消除,只能在原来的基础上多添几笔。所以说只能做加法。

    习惯了View的那一套,还挺不适应的。毕竟原来给TextView设置几个属性,就可以直接当Button用,各种控件其实分的没有那么清楚。现在的话,边框按钮就是边框按钮,没办法变成别的。

    2. if else 地狱


https://img1.sycdn.imooc.com//60e0e9d30001374710120346.jpg


我个人非常讨厌写if else 语句。如果必须要if,那至少else得去掉。

所以,我经常在函数里面写一些if(xxx) return这样的句式,只要我返回的够快,后面的代码就与else无异。

只是看着这些if return就让人感觉很爽。然而到了Compose里面,奇奇怪怪的东西就来了:


https://img1.sycdn.imooc.com//60e0ea130001d10606700731.jpg




https://img1.sycdn.imooc.com//60e0ea290001d88307080745.jpg


这两段代码在逻辑上几乎是一摸一样的,但是前面的代码会报错,错误信息就这几个字:

Start/end imbalance 

而且没有栈跟踪,我是说所有的栈跟踪都是Compose内部的代码,它不会告诉你报错是在哪一行......开调试也没用,程序会崩溃但是调试器依旧能正常执行代码。

试了两个多小时,才把问题定位到return,而且不止一处仅仅因为return崩溃。

一开始猜的是外层也有Column,所以这个返回不知道该返回哪个......但是同样是返回,下面的

if (process < 1f) return@Column就完全没有问题。

毫无头绪。总之,只能暂时少在Compose里面用return了。

3. 翻译翻译,什么叫remember

第一次看到remember这个关键字,去查官方文档,是这样说的:


https://img1.sycdn.imooc.com//60e0ea5100019cd408760166.jpg




https://img1.sycdn.imooc.com//60e0ea5e0001073a08650140.jpg


不知道是翻译的锅,还是原本的描述就这么难受......反正我一开始没搞懂文档中说的状态是什么意思。直到我遇到某个BUG,是因为在Compose函数里面,有一个方法被多次调用了......这个Compose函数里只有一个Text需要被更新,而且这个Text外面套了很多层Column,Box啥的。隐约记得官方的描述是,当数据发生改变,视图仅仅会更新和数据有关的部分......在上面的例子里,就只是那一个Text中的文字需要被更新,所以我想的是只有Text被更新......但事实是,所谓的更新有关的部分,其实就是“回调”整个Compose函数。

到这我才明白remember的意义。一句话就是:

remember可以记住局部变量。

因为函数被多次调用,函数里面的变量会被多次赋值,如果不想被多次赋值就用remember。

4.配色带师


https://img1.sycdn.imooc.com//60e0ea7f0001d45105400472.jpg


我以为给前面三个赋值就行了,没想到我就设置一个主题颜色,就需要给所有的颜色赋值......而且后面的那些颜色几乎都是MD的默认颜色。明明可以给默认值,却非要折磨使用者,强制给所有颜色赋值......懒癌患者的末日。

5.null

有一说一,用着挺爽的。


https://img1.sycdn.imooc.com//60e0ead10001cffe03960609.jpg


这种页面用View那一套的话,首先得写一个布局文件,然后是写一个适配器,适配器里面要写ViewHolder,为了防止耦合得自己定义一个接口让外部来处理点击事件......

想想就头大。而Compose呢,视图+功能也就100行代码,没有任何多出来的类和接口。

什么叫优雅,这就叫优雅。

除了各种功能上的逻辑经常和视图揉在一起以外。




点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消