自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

lt的博客

Android开发工程师,喜欢Kotlin并热衷于各种骚操作

  • 博客(124)
  • 资源 (1)
  • 收藏
  • 关注

原创 KMP基础架构

Kotlin可以用来开发全栈, 我们所熟悉的各个端几乎都支持(除了鸿蒙)而我们要开发好KMP项目需要一个好的基础架构,这样不仅代码更清晰,而且能共享更多的代码。

2023-11-30 17:13:08 1342

原创 使用KSP处理注解和生成Kotlin代码

ksp是Kotlin 符号处理工具,类似于kapt(apt),可用于开发轻量级编译器插件.也可以理解为注解处理和编译时代码生成工具(也能处理所有文件,不止被注解标记的)既然有了kapt(apt),为什么还要有ksp?速度比kapt更快,性能更好对kotlin的支持更好适用于Kotlin Multiplatform可以直接生成kotlin代码文件(实际上可以生成任意类型的文件)

2022-10-24 09:03:37 3127 2

原创 动手实现Kotlin协程同步切换线程,以及Kotlin协程是如何实现线程切换的

前言突发奇想想搞一个同步切换线程的Kotlin协程,而不用各种withContext(){},可以减少嵌套且逻辑更清晰,想实现的结果如下图:分析实现我们想要的结果,首先需要知道协程为什么可以控制线程的切换以及在挂起函数恢复的时候回到原来设定的线程中ps:挂起函数比普通函数多出了两个操作:挂起和恢复,具体参考:https://blog.csdn.net/qq_33505109/article/details/109066392其实控制线程切换是协程库内内置的一个拦截器类:Continu

2021-01-14 18:09:32 3061 4

原创 Kotlin的各种骚气语法

这种操作称为柯里化,其原理就是一个方法调用后又返回了一个方法,然后调用这个返回值后又返回了一个方法,也属于高阶函数。返回了 ()->方法 , 而这个方法的签名是 ()->Unit , 连续调用了三次后获取到最后的Unit返回值。但其实这种是重写的操作符,分别是重写了setter和getter,类似于list[0]=1这样。注意看这两个示例方法的返回值,login2 比 login1的返回值短的多,但其实他们是一样的。于是我们可以通过import并设置别名,这样就可以区分开来了。

2024-02-29 21:48:07 932

原创 Room数据库自动迁移功能的原理

Room数据有有自动升级迁移数据库版本的功能,我们研究下它是怎么实现的。

2024-01-29 15:07:21 437

原创 Compose State的各种转换

很简单,就一个方法但是也得注意,上面的方法是针对泛型的,如果只是基本数据类型,推荐使用相应的方法,在JVM上可以减少拆装箱带来的消耗1.使用 MutableState 的对象,通过控制 MutableState 对象的 value 属性来获取和设置值2.使用 MutableState 的解构声明,获取 value 和 setValue(高阶函数) 来使用可以看到其声明,value 和 setValue 就对应 component1 和 component2 方法3.使用属性代理。

2023-12-26 18:39:47 108

原创 KMP中的资源处理(字符串,图片等)

以安卓开发者的视角,资源有很多种类,不过常用的是这几种而KMP中的UI一般用Compose其中的anim,layout,colors,themes都使用代码的形式实现而KMP中目前貌似没有通用的字符串和图片资源管理和获取的方式,于是我们自己实现一下。

2023-10-24 19:18:51 121

原创 KMP中的BuildConfig

Android开发中BuildConfig很方便,可以自动的生成是否Debug,版本名,版本号等属性也可以通过gradle配置来自定义生成的属性而KMP中并没有这样的方式,导致开发方面并不方便而像DEBUG这样的属性如果手动去修改代码则非常容易出现问题我都想用ksp写一个,好在发现有人写了一个,还很好用。

2023-09-27 16:24:43 130

原创 Gradle同步任务一直不动问题(非网络情况)

​最近更新ComposeViews的Kotlin和Compose版本时遇见一个问题,Gradle同步时始终会卡在一个位置,同步了一晚上也没用

2023-08-01 11:09:46 208

原创 Kotlin空安全类型之平台类型

众所周知,Kotlin的空安全很方便,能避免绝大部分的空安全问题一般类型分为:可空类型如 String?不可空类型 String其中可空类型的String?可以赋值null或String类型的值,在使用时必须显式的进行空处理而不可空类型的String,只能赋值String类型,无法向其赋值null,使用时无需空处理,也不会遇见空指针异常但为什么我上面说能避免绝大部分的空安全问题呢?是因为Kotlin为了兼容其他语言,还有对应语言平台的平台类型 String!

2023-07-25 21:38:16 298

原创 检查kotlinx-serialization-json的bean类是否都加了@Serializable注解

json解析框架有很多,但Kotlin跨平台只能使用kotlinx-serialization-json而官方没有提供检查是否bean类都加注解,或者一键给某个包自动加注解的功能,导致可能会出现运行时的崩溃,所以我们可以自己用ksp写个程序来检查一下。

2023-06-21 22:30:00 268

原创 Kotlin跨平台的网络请求框架-跨平台的Retrofit

一般安卓开发中网络请求框架都是使用OkHttp+Retrofit,但其只能应用于jvm平台上而Kotlin可用于jvm,js,native因此一个Kotlin跨平台的网络请求框架必不可少而ktor-client是Kotlin官方提供的网络请求框架,可以跨平台的进行网络请求与之对应的还有ktor-server可以用来写服务器端(但这不是这篇文章的重点)但ktor-client使用起来还是稍微有些麻烦,所以我们可以模仿Retrofit开发一个更方便使用的跨平台网络请求框架。

2023-05-31 21:45:00 1091

原创 mysql数据库自动备份

服务器中数据库的数据是最重要的东西,如果因为某些情况导致数据库数据错误,数据错乱或数据库崩溃,这时一定要及时的修复,但如果数据丢失或数据没法用了,这时就要回滚数据了,而这时就需要我们经常的备份数据库的数据

2023-04-26 21:34:45 2615

原创 解决Kotlin/Native报错:There is still an unbound symbol after generation of IR module <xxx>:

报错信息There is still an unbound symbol after generation of IR module :Unbound public symbol IrSimpleFunctionPublicSymbolImpl: xxx

2023-03-31 23:49:22 174

原创 使用MavenCentral发布Kotlin多平台库的远程依赖(KMM,KMP)

开发者可能都会做自己的开源库,像我以前只做一些单平台的,如Android或JVM平台,这时候直接使用jitpack即可,很简单就能发布远程依赖而现在Kotlin可以通过expect来实现原生多平台项目(或库),这时我们开发出来一个多平台的库,可以使用MavenCentral来发布

2023-02-25 23:24:10 537

原创 Compose之跨平台Activity页面

​我们可以使用Kotlin expect来关联Android的Activity和Desktop的Compose fun(或Window),写一个统一的类BaseComposeActivity这样BaseComposeActivity在Android中就映射为一个真正的Activity,而在Desktop中映射为一个Compose fun,方便我们进行页面导航

2023-01-31 14:28:23 1269

原创 Kotlin如何延时准确的循环执行事件,比如倒计时或每一秒执行一次事件

延时循环执行事件很简单,且有很多方式,但想要延时相对精确,就需要稍微设计一下了,众所周知我们常用的操作系统都不是实时操作系统,比如Windows,Linux,Android等,所以我们上面的延时操作不管是Thread.sleep(1000)还是delay(1000)都不一定会在1000毫秒后恢复,我们测试一下

2022-12-11 20:51:03 4147

原创 解决<get-metadataDependencyResolutions>(...) must not be null的问题

直接搜(...) must not be null在各种搜索引擎上都无法搜索到具体内容,后来搜了下transformCommonMainDependenc这个task[org.gradle.internal.buildevents.BuildExceptionReporter] Execution failed for task ':beans:transformCommonMainDependenc

2022-11-21 15:01:56 1180

原创 Compose中的RefreshLayout

Compose库中是没有原生的类似RefreshLayout的布局的于是我们来自己实现一个RefreshLayout。

2022-09-29 22:24:00 1069 2

原创 分析Jetpack Compose动画内部是如何实现的

Compose的动画Api用起来很简单,效果看起来很神奇,那么它内部到底是如何运转的呢?我们去看看Jetpack Compose动画(animate)Api内部的实现原理我们主要就看一下animateDpAsState(animate*AsState)做了什么跟一下animateDpAsState最后会走进animateValueAsState方法中.........

2022-08-31 17:14:41 847

原创 Compose中的FlowLayout

Compose库中是没有原生的类似FlowLayout的布局的,于是我们来自己实现一个FlowLayout

2022-07-19 20:00:00 753

原创 Compose中的“ViewPager“和Banner

Compose中简单易用的"ViewPager"(ComposePager)和Banner

2022-07-19 11:05:43 1153

原创 Compose中更灵活易用的TextField以及密码输入框

JetpackCompose中的TextField简单用起来很方便,但如果要自定义ui就不好实现了,我们看一下效果TextField类似的还有OutlinedTextField他们都有共同的api和特点,简单使用很方便,但是其有很大的内边距不好调整,且其背景ui也不太好调整(背景可以改成透明,但间距我查看源码也没改成...)幸亏Compose中预留了基础的输入框实现没有边距,没有背景,很适合我们自定义ui,所以我就根据BasicTextField封装了一下,使ui更简单易用。...

2022-07-18 19:15:16 3389 2

原创 安卓TextView的lineHeight*lineCount!=height问题,解决不支持滚动的系统下对多页Text进行分页

最近在做运行在墨水屏系统上的程序,由于墨水屏刷新率比较低,所以系统内的软件是不允许滚动和加动画的(在逻辑上)这样就导致了平时在普通安卓手机上很简单的程序,在墨水屏系统上就很麻烦,比如多页的应用,普通安卓机直接搞一个ScrollView和RecyclerView就可以了,但墨水屏系统上你需要自己计算每页展示多少内容,然后在进行分页处理...

2022-06-23 15:54:06 1115 1

原创 Compose-jb图片加载库load-the-image,适用于KMM Compose desktop桌面端(Windows,Linux,MacOs)

Android平台上有很多优秀的图片加载框架,比如Glide,Picasso,Fresco而Compose-jetpack上的图片加载框架有Coil但Compose-jb上却暂时没有图片加载框架,正好我有用Compose-jb写一些小工具,有图片加载的需求,于是就仿照Android平台的图片加载库写了一个具有简单功能的图片加载库项目已开源,地址: load-the-image (github.com) 欢迎star功能1.简单的支持多个桌面平台的图片加载(部分格式异步加载)2.支持多种格式:网络链接,本地文

2022-06-10 17:21:23 1695 4

原创 JVM中性能更好的ArrayList<Int>

前言众所周知,kotlin中有ArrayList<Int>,Array<Int>,IntArray,可他们都有什么区别呢?为什么要有这么多大致相同的类型?正文我们先看一下他们相对于jvm中的类型ArrayList<Int> = ArrayList<Integer>Array<Int> = Integer[]IntArray = int[]可以看出来前面两种都用到了int的包装类型Integer,而IntArray是用的基

2022-05-31 16:58:30 482

原创 Compose实现状态选择器(原生drawable select标签效果) InteractionSource

前言在Compose中做drawable shape是很方便的,比如加个圆角,加个边框之类的,只需要如下:shape: Surface( shape = MaterialTheme.shapes.large, color = Color.Gray, modifier = Modifier.size(50.dp) ) { }

2022-04-28 17:25:13 2722 2

原创 Kotlin1.6.20好用的新特性:多receiver扩展函数,绝不可空类型,并行编译kotlin减少编译时间

前言最近kotlin1.6.20新版本出来了,并带来了几个很好用的特性,来尝尝鲜正文1.多receiver扩展函数kt的扩展函数大家应该都懂,但什么是receiver呢?比如下面的代码,是给View扩展的,View就是这个receiver的类型,而this@click就是这个receiver对象fun View.click(onClick: (View) -> Unit) { setOnClickListener { onClick(this@click)

2022-04-08 22:00:48 2930

原创 安卓使用Span富文本给某段Text文本加上波浪线

前言最近项目需要给某段文字动态的加上波浪线,但是没搜到什么好的方案,于是打算自己实现一下,效果如下:正文本文使用的方案是自定义Span富文本,并在Span中用贝塞尔曲线来绘制出波浪线代码如下:import android.graphics.Canvasimport android.graphics.Colorimport android.graphics.Paintimport android.graphics.Pathimport android.text.style.

2022-04-01 15:38:38 799

原创 KMM Kotlin expect的几种声明方式

前言Kotlin的expect关键字一般用在多平台上,比如在多平台项目中的common中声明方法签名,然后由不同的平台去实现该方法,从而实现一个多平台(跨平台)方法.创建KMM项目可以参考:KMM(二)+Compose(二) 开发一个Kotlin多平台应用_滔lt的博客-CSDN博客正文接下来就说一下Kotlin expect的几种声明方式1.顶层函数和顶层扩展函数在commonMain文件夹中声明:在androidMain(和其他平台)文件夹中实现:声明并实现后,.

2022-03-17 23:37:40 3584 2

原创 KMM+Compose 开发一个Kotlin多平台应用

前言现在跨平台开发框架有很多,比如H5类型,RN,Flutter等,而Kotlin多平台+Compose跨平台ui可能也是未来一种好用的开发框架ps:后文KMM都是指Kotlin多平台框架,而不是单指Kotlin Multiplatform Mobile虽然目前KMM还有些不太成熟,Compose跨平台的支持平台不太全,单也不妨碍现在来尝尝鲜.ps:Compose-android正式,Compose-desktop正式,Compose-web未正式,Compose-ios期待中...项目

2022-03-15 21:45:00 6789

原创 使用Kotlin写脚本

前言Kotlin不仅可以用来写Android,也可以写后端,Desktop桌面程序,脚本(和未来的ios,网页,native等)比如开发时使用Gradle的build.gradle也可以使用kotlin脚本编写,只需要将后缀改为kts即可声明为kotlin脚本文件,如build.gradle.kts,迁移指南:迁移gradle至kts可以说kotlin的功能非常的全,基本学会一门语言吃遍天下了那普通的脚本如何用kotlin来写呢?配置首先需要下载安装jdk并配置一下jdk的环境变量:

2022-02-28 21:15:00 4422

原创 RecyclerView复杂适配器的终极形态?代码更解耦

前言RecyclerView是Android开发中很常用的控件,市面上也有很多种封装,使其更易用,但是面对复杂的适配器需求,则很难做到逻辑清晰且解耦,比如聊天消息的适配器正文1.首先我们用最原始的方法写一个简单的聊天消息的rv实现图如下:代码如下:class MainActivity : AppCompatActivity() { //数据源: type to data val msgData = mutableListOf<Pair<Int, An

2022-01-07 15:50:10 3042 4

原创 超简单-用协程简化你的网络请求吧,兼容你的老项目和旧的网络请求方式

前言在Kotlin协程(后简称协程)出来之后,颠覆了我们很多工具类的封装方式,大大简化了我们很多api的调用,并且使异步操作逻辑更清晰了其中一个很标志性的地方就属网络请求了,以前的网络请求方式声明很麻烦,请求和响应也很麻烦,总结一句话就是啰嗦且易出错ps:最终的使用方式示例:比如使用网络请求的进化过程:1.从一开始的HttpURLConnection的一把梭,直接一个请求写一串代码(代码太多就不写了)2.到后续使用三方封装的网络框架,如XUtils,Volly,OkHttp等,这

2021-12-31 17:23:37 2231

原创 Compose 手势事件:防止重复点击,双击,长按,全局触摸隐藏键盘

前言JetPack Compose (后续简称compose) release版已经出来了三四个月了,虽然没正式版之前也学过几次,但一直没有机会用,在加上api的变更,导致之前学的都忘完了,现在终于有机会写一点(将原有项目的简单页面用compose重写),发现了一些compose的优势和劣势:优势:1.超容易封装和组合,相对于原生自定义组合view,compose组合一个view简直不要太简单,只需要一个方法就能搞定,封装也更简便好用(组合vs继承)2.跨平台,目前kotlin的跨平台,co

2021-11-17 17:52:25 4778 2

原创 KMM 搭建环境,并运行安卓和ios

前言kmm是Kotlin Multiplatform Mobile(kt移动跨平台)的缩写,虽然目前还不是正式版本,但也是可以用了kmm的跨平台实现方式是将代码分成三块:安卓原生代码ios原生代码kotlin共享代码,其中在安卓部分会将kotlin共享代码编译为jvm文件并当做lib加入到安卓原生代码中,而ios则是将kotlin共享代码编译成native(oc?)代码,然后当做framework引入(图引自kt官网)这样既可以跨平台,又保证了平台灵活性,并且性能相对于flu

2021-11-07 01:37:48 5655

原创 Kotlin-如何创建一个好用的协程作用域

前言kotlin中使用协程,是一定要跟协程作用域一起配合使用的,否则可能协程的生命周期无法被准确控制,造成内存泄漏或其他问题.我们一般在安卓项目中使用协程作用域,可能会在BaseActtivity中new 一个MainScope(),并在onDestory时cancel掉,或者只在ViewModel中使用viewModelScope,然后会在ViewModel的onClose中自动cancel掉.但我们可能不只需要这些效果,比如在协程作用域中拿到Context或Activity,或者需要统一的捕

2021-10-30 17:06:08 1973

原创 解决:The application could not be installed: INSTALL_FAILED_SHARED_USER_INCOMPATIBLE

一般这种情况,你都可以在清单文件顶部找到类似如下的代码:他的作用是:在AndroidManife.xml 中添加android:sharedUser可以将不同的程序加入到同一个进程中,方便数据的共享。但是有个前提是需要签名相同而报这个错有可能是因为签名和系统签名不相同, android.uid.system是表示系统进程解决方案1.如果是自己定制的系统可以使用系统签名,如果是上传到应用市场的,每个应用市场都不相同,所以可能就用不了2.如果不想和系统一个进程,就删掉这行代码扩.

2021-09-08 16:27:07 21249 3

原创 好用的Span(富文本)api

/** * 将一段文字中指定range的文字改变大小 * @param range 要改变大小的文字的范围 ps:你关注的${name}也关注了你哟 = 4..(name.length+4) * @param scale 缩放值,大于1,则比其他文字大;小于1,则比其他文字小;默认是1.5 * ps: https://mp.weixin.qq.com/s/ji9MRaMhpVM711lDYL0LFw * 文章里搜索TextAppearanceSpan,可以设置某一段的很多.

2021-08-31 22:28:14 282

原创 ViewModel优雅的弹加载窗和获取Context

前言目前安卓开发一般都是用的mvvm模式,Jetpack的ViewModel是必不可少的一部分,而vm的生命周期要比Activity和Fragment长的,所以其一般不推荐其直接持有A或F,因为可能会造成内存泄漏的问题,但是不传入,Context的获取和显示网络加载弹窗又成了问题.正文首先解决显示网络加载弹窗的问题,其有两种方案:1.使用MutableLiveData首先我们在BaseViewModel中加入弹窗的MutableLiveDataval dialogShow = Mu

2021-07-31 16:22:18 4191

idea或as黑色主题设置(复加一些快捷生成代码的Live Templates)settings.zip

idea或as黑色主题设置(复加一些快捷生成代码的Live Templates) 比如: 判断两个字符串是否相同 字符串是否为空 for循环 view构造 构造fragment传递参数的方法 打印日志(包含类名方法名函数名) 快速todo

2020-04-29

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除