写出更现代化的Python代码:聊聊 Type Hint
Type Hint是 Python 3.5 新增的支持,中文可以译为 类型提示。屏幕前的你或许听过,又或许没有。所以今天,让我们一起了解了解。本文基于 Python 3.10.4,部分代码需要在 Python 3.10.0 及以上运行,原因在后续文章中会有说明本文的代码编辑器为 VS Code ,您可以选择其他现代编辑器/IDE以体验
为什么需要 Type Hint简而言之,按我的理解,type hint的目的是写给“别人”看。这个“别人”,就包括代码编辑器、其他阅读代码的人和几天后的你自己。废话不多说,Show You My Code!
开始写代码现在我们假设,你想写一个函数,用处是统计给定字符串中某个字符出现的次数,于是你大手一挥,写下了这样的代码:
12def count_char(text, char): return text.啥来着???
尴尬的是,你记得str类有这个方法,但却忘记了这个方法叫啥了,看看编辑器的自动提示?
遗憾的是,编辑器不知道你的text是啥类型的,自然没法帮你补全。那我们能不能告诉它:这是个str呢?可以,给参数名后面加个: str就好 ...
Compose 数据持久化辅助框架:ComposeDataSaver 的一些新变化
七个月前,我写了个用于辅助 Jetpack Compose 做数据持久化的框架,并把它放到了 Github 上。在当时,我还写了篇简单的文章介绍:Jetpack Compose 中优雅完成数据持久化。七个月后,我对它进行了大更新。这篇文章,再来推广推广它。
嘿嘿嘿,不妨看看,说不定有点用呢~
为什么写这个框架写这个框架是基于这样一个很简单的思想:
我们知道,在Compose中,函数会被反复调用(也就是重组)。所以如果要记住一个状态,需要remember{ }。也就是这样:
12345 var number by remember{ mutableStateOf(1) } ... onClick = { number++ }
再进一步呢?如果需要页面横竖屏切换时还记住它,我们就需要用到记得更持久一些的rememberSaveable。也就是这样
12345 var number by rememberSaveable { mutableStateOf(1) } ... onClick = ...
写出优雅的Kotlin代码:聊聊我认为的 "Kotlinic"
“Kotlinic” 一词属于捏造的,参考的是著名的”Pythonic”,后者可以译为“很Python”,意思是写的代码一看就很有Python味。照这个意思,”Kotlinic”就是“很Kotlin”,很有Kotlin味。
Kotlin程序员们不少是从Java转过来的,包括我;大部分时候,大家也都把它当大号的Java语法糖在用。但Kotlin总归是一门新语言,而且,在我眼里还是门挺优雅的语言。所以,或许我们可以把Kotlin写得更Kotlin些。我想简单粗浅的聊聊。
本文希望:聊聊一些好用的、简洁的但又不失语义的Kotlin代码
本文不希望:鼓励无脑追求高超技巧,完全放弃了可读性、可维护性,全篇奇技淫巧的操作
受限于本人水平,可能有错误或不严谨之处。如有此类问题,欢迎指出。也欢迎在评论区探讨交流~
善用with、apply、also、letwith和applywith和apply,除了能帮忙少打一些代码外,重要的是能让代码区分更明确。比如
123456 val textView = TextView(context) textView.text = "fish" ...
Jetpack Compose 性能优化参考:编译指标
本文译自:https://chris.banes.dev/composable-metrics/原标题:Composable Metrics译:FunnySaltyFish
本文为文章《如何在 Jetpack Compose 中调试重组》中附录的文章,译者同样进行了翻译。限于译者水平,不免有谬误之可能,如有错误,欢迎指正。
当一个团队开始使用 Jetpack Compose 时,他们中的大多数人最终会发现少了一块拼图:如何测量可组合项(Composable)的性能。
在 Jetpack Compose 1.2.0中,Compose 编译器添加了一个新功能,它可以在构建时输出各种与性能相关的指标,让我们能够窥视幕后,看看潜在的性能问题在哪些地方。在这篇博文中,我们将探索新的指标,看看我们能找到什么。
在开始阅读之前需要了解的一些事项:
最终写完后的结果显示,这是一篇很长 的博文,涵盖了 Compose 的许多工作原理。所以阅读这篇文章可能得花点时间。
本文仅仅设立了一些预期,到结尾也没有真正做成什么“明显的成效”😅。但是,希望您能更好地了解您在设计上的选择将如何影响 C ...
【杂谈】我用 Jetpack Compose 的这一年
关于这篇文章,其实本来并没有什么写作计划。触发它诞生的事情是,今天早上,QQ空间给我推了这样一条消息:
一年前的今天,我敲下了第一行的Hello Android for Jetpack Compose,而到今天,我的个人小项目 译站 早已全面转向 Jetpack Compose 。关于 Compose,我也写了几个简易的开源库、作了几篇小文章。所以今天,不妨来谈谈我接触 Compose 的这一年。
本文 不是技术文 ,其中观点仅代表我个人。受限于本人技术水平,难免有误,还望您包容谅解
初我接触 Compose 的时间应该还算较早,虽然不是最早的一批,但也算是那时的少数(至少我以为)。彼时,Google 发布 beta 版本,尚且只有 AS 的 Beta 版本支持。为了体验,我将一直使用的AS Stable切成了AS Beta,用默认模板敲出了第一行代码。
我是一个对新技术很感兴趣的人,这可能也是我去学习 Compose 的原因。声明式UI的概念虽然相较View很新奇,但鉴于我接触过Vue和Flutter,所以也还能上手。
上手是可以上手,但奈何资料确实不多,尤其是中文的。对我来说,早 ...
如何在 Jetpack Compose 中调试重组
本文是 Compose 相关的偏进阶文章,给出了一些可用于 Compose 调试的方法,并阐释了一些性能优化方面的小细节。
本文译自 How can I debug recompositions in Jetpack Compose?
原作者:https://twitter.com/vinaygaba
译:FunnySaltyFish
自从 Jetpack Compose 的第一个稳定版本上线以来,已经过去了好几个月(译注:本文写于2022年4月)。多家公司已经使用了 Compose 来参与构建他们的 Android 应用程序,成千上万的 Android 工程师每天都在使用 Jetpack Compose 。
虽然已经有大量的文档可以帮助开发人员接受这种新的编程模式,但仍有这么个概念让许多人摸不着头脑。它就是Recomposition,Compose 赖以运作的基础。
重组是在输入更改时再次调用可组合函数的过程。当函数的输入发生更改时,它便会发生。当 Compose 基于新输入进行重组时,它仅调用可能已更改的函数或 lambda,并跳过其余部分。通过跳过所有未更改参数的函数或 la ...
Jetpack Compose 自定义布局+物理引擎 = ?
效果废话不说,先上图!
所对应代码大致为:
123456789101112131415161718192021222324val physicsConfig = PhysicsConfig()PhysicsLayout(modifier = modifier, physicsLayoutState = physicsLayoutState, boundSize = boundSize.toFloat()) { RandomColorBox(modifier = Modifier .size(40.dp) .physics(physicsConfig, initialX = 300f, initialY = 500f)) // This one has a circle shape // so you need to modify it with not only a `clip()` Modifier to make it "looks like" a circle // but also a `phy ...
Jetpack Compose LazyGrid全解
本文参考自谷歌官方视频Lazy layouts in Compose - YouTube,基于Compose 1.2.0-beta02(截止发文时最新版本)
前言前段时间Compose发布了1.2.0beta版本,最大的变化之一莫过于LazyLayout去除了实验性标志。所以接下来,咱们不妨一起看看LazyGrid的用法(嗯?这和上一句有关系吗)
LazyGrid包含两种微件:LazyVerticalGrid和LazyHorizontalGrid。两者内部均由LazyLayout实现(包括LazyColumn和LazyRow也是由LazyLayout实现的)。不过今天我们不去考虑底层的LazyLayout,单纯着眼于Grid们
为行文方便,此处仅以LazyVerticalGrid为例。
基本使用最简单的使用如下所示:
12345678910111213@Composablefun SimpleLazyGrid(){ LazyVerticalGrid( modifier = Modifier.fillMaxWidth(), // 固定两列 ...
Jetpack Compose 自定义绘制——高仿Keep周运动数据页面
废话之前先上图吧,如果不是有人告诉,你可以一眼看出哪个是真哪个是假吗?
仿制整个页面(仅仅页面)大概花了我两个小时,不过仅仅是静态的、不可点击的。图有形似而无功能。
自定义绘制Jetpack Compose 自定义绘制的文章其实并不少了,基本代码上和View体系基本类似,就是方法上有所差异
详细的内容可以见其他作者的文章,如
路很长OoO的JetPack-Compose - 自定义绘制 - 掘金 (juejin.cn)
RugerMc的使用 Jetpack Compose 完成自定义绘制 - 掘金 (juejin.cn)
……
我就不赘述
上述代码中,中间那块数据图就是自己画的(Keep 用的是 RecyclerView)。大致上,包括这几个部分
四个浅色矩形和底部文字
三条浅色横线和一条深色横线
中间的深色矩形和底部文字
中间竖线、矩形和底部的小线段
其中1->3的顺序不能更改,因为三条浅色横线在浅色矩形之上,但是在深色矩形之下
浅色矩形页面上一共4个浅色矩形,观察Keep可知,它们的高度与 对应数据和运动记录中最长时间之比 成正比
所以先计算一下最大的数字,找一些变 ...
博客迁移完毕
鉴于 CDN jsdelivr 难以访问,以及 Gitee 于 2022/03/25 突然禁止图床链接,我于 2022/03/26-2022/03/28 进行了博客迁移工作主要内容包括:
更换 jsdelivr 为 cdn.jsdelivr.net
更换 图片链接 到个人服务器
基于 Lsky Pro 2.0 搭建新图床,之后的图片将保存于自建图床完毕!
更新:2022年6月23日,我又将 cdn 迁回 jsdelivr