![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Kotlin
文章平均质量分 85
fundroid
Android GDE(谷歌开发者专家)| 互联网大厂移动端架构师
展开
-
Jetpack Compose 1.5 发布:全新 Modifier 系统助力性能提升
Jetpack Compose 1.5 发布,性能终于得到大幅提升,这得益于全新的 Modifier 实现方式原创 2023-09-11 08:30:00 · 1973 阅读 · 6 评论 -
Kotlin 1.9 新特性预览:data object (数据单例)
data object 数据单例是 Kotlin 1.9 中预定引入的新特性 ,但其实从 1.7.20 开始就可以预览了。接下来让我们看看它有哪些特点。原创 2023-07-04 08:30:00 · 1917 阅读 · 0 评论 -
深入浅出 Compose Compiler(1) Kotlin Compiler & KCP
Compose 的语法简洁、代码效率非常高,这主要得益于 Compose Compiler 的一系列编译期魔法,帮开发者生成了很多样板代码。但编译期插桩也阻碍了我们对于 Compose 运行原理的认知,想要真正读懂 Compose 就必须先了解它的 Compiler。本系列文章将带大家揭开 Compose Compiler 的神秘面纱。Compose 是一个 Kotlin Only 框架,所以 Compose Compiler 的本质是一个 KCP(Kotlin Compiler Plugin)。原创 2023-04-29 12:00:54 · 1597 阅读 · 4 评论 -
终于懂了~ 图解 SharedFlow 缓存系统
图解 MutableSharedFlow 的 replay ,extraBufferCapacity,onBufferOverflow 等参数,深入理解 SharedFlow 的缓存系统原创 2022-10-07 10:00:00 · 2445 阅读 · 0 评论 -
面试题:聊聊 Kotlin 代理的“缺陷”以及如何应对
Kotlin 代理是面试中经常被问到的问题,比如介绍一下代理的实现原理以及在使用中的一些注意事项等,本文将带你梳理这些问题,让你从更高的维度上认识“代理”Kotlin 有很多让人津津乐道的语法,“代理”就是经常被提及的一个。Kotlin 在语言级别通过 by 关键字支持了代理模式的实现。代理模式是最常用的设计模式之一,它是使用“组合”替代“继承”的最佳实践。下面取自 Wiki 中关于代理模式的例子:class Rectangle(val width: Int, val height: Int) {.原创 2022-05-02 09:30:00 · 471 阅读 · 2 评论 -
Jetpack MVVM 七宗罪之六: ViewModel 的接口暴露不合理
在 Jetpack 架构规范中, ViewModel 与 View 之间应该遵循单向数据流的通信方式,Events 永远从 View 流向 VM ,而 State 从 VM 流向 View。如果 ViewModel 对 View 暴露了不适当的接口类型,则会破坏单向数据流的形成。不适当的接口类型常见于以下两点:暴露 Mutable 状态暴露 Suspend 方法暴露 Mutable 状态ViewModel 对外暴露的数据状态,无论是 LiveData 或是 StateFlow 都应该使用 I原创 2022-03-16 02:37:20 · 3892 阅读 · 2 评论 -
巧用 @JvmName 解决 Kotlin 函数签名冲突
Kotlin(JVM) 中定义下面这样两个方函数时,编译器会报错fun foo(value: List<String>) {}fun foo(value: List<Int>) {}Platform declaration clash: The following declarations have the same JVM signature (method(Ljava/util/List;)V):因为 Java 的泛型编译期擦除,所以 JVM 无法识别签名中泛型的区原创 2022-03-11 19:27:45 · 5668 阅读 · 0 评论 -
像 Compose 那样写代码 :Kotlin DSL 原理与实战
1. 前言Kotlin 是一门对 DSL 友好的语言,它的许多语法特性有助于 DSL 的打造,提升特定场景下代码的可读性和安全性。本文将带你了解 Kotlin DSL 的一般实现步骤,以及如何通过 @DslMarker , Context Receivers 等特性提升 DSL 的易用性。2. 什么是 DSL?DSL 全称是 Domain Specific Language,即领域特定语言。顾名思义 DSL 是用来专门解决某一特定问题的语言,比如我们常见的 SQL 或者正则表达式等,DSL 没有原创 2022-02-28 09:00:00 · 3899 阅读 · 12 评论 -
为什么 RxJava 有 Single / Maybe 等单发数据类型,而 Flow 没有?
Coroutine Flow 与 RxJava 都是流式数据处理框架, 所以经常被拿来做比较,本文比较一下他们的数据类型。Rx 与 Flow 在单发数据支持上的不同RxJava 支持多种数据类型Observable :流式数据类型Flowable:与 Observable 类似,支持背压Single:单发数据类型,只能且必须发射一个数据Maybe:单发数据类型,发射零个或一个数据Completable:不发射任何数据,只通知流的结束。以上,Single<T>,Maybe&l.原创 2022-02-13 22:12:29 · 2036 阅读 · 2 评论 -
网友提议 Kotlin 增加这些新特性。。
前言Kotlin 是一门开放的语言,不仅仅是源码的开放,任意使用者都可以直接参与它的建设。大家可以通过 YouTrack 向社区提出自己的 idea 和 issue ,其中一些呼声高的 issue 会进入 KEEP 交由 Kotlin 团队管理维护,并有可能被最终实现、出现在未来的某个版本中。YouTrack Hot Issue透过 YouTrack 中当下的热门 issue ,我们可以预见 Kotlin 未来有可能引入下面这些新特性:命名空间多接受者扩展函数集合字面值双类型属性名原创 2022-01-27 11:43:04 · 313 阅读 · 0 评论 -
Compose Multiplatform 正式版将于年内发布
近日,JetBrains 公司发布了 Compose Multiplatform 的 Beta 版本,这距离此前 Alpha 版本的发布才过去两个多月。这个版本中包含了许多新的改进,在桌面端与Web端分别增加了新的 API ,并对已有的部分 APIs 进行了稳定。Beta 版的发布意味着距离 1.0 正式版更近了一步,另据官方透漏正式版最早将于年内发布。Jetpack Compose 是 Android 最新推出的声明式 UI 工具包。JetBrains 受到 Jetpack Compose 的启发,原创 2021-11-28 23:11:32 · 2243 阅读 · 0 评论 -
Kotlin 1.6 正式发布,都有哪些新特性?
11月16日,Kotlin 1.6 正式对外发布。接下来就一起看一下在这个版本中都有哪些新的语法特性更安全的when语句(exhaustive when statements)挂起函数类型可作父类 (suspending functions as supertypes )普通函数转挂起函数(suspend conversion)Builder函数更加易用递归泛型的类型推导注解相关的一些优化1. 更安全的 when 语句Kotlin 的 when 关键字允许我们在 case 分支中.原创 2021-11-18 04:59:13 · 7996 阅读 · 9 评论 -
@OnLifecycleEvent 遭废弃,推荐使用 DefaultLifecycleObserver 替代
近期 androidx.lifecycle 发布了 2.4.0 版本,此次更新中 @OnLifecycleEvent 注解被废弃,官方建议使用 LifecycleEventObserver 或者 DefaultLifecycleObserver 替代现代的 Android 应用中都少不了 Lifecycle 的身影,正是各种 lifecycle-aware 组件的存在保证了程序的健壮性。Lifecycle 本质是一个观察者模式的最佳实践,通过实现 LifecycleObserver 接口,开发者可原创 2021-11-09 11:46:56 · 11306 阅读 · 1 评论 -
ComposeOptions.kotlinCompilerVersion is deprecated
我为我的 Compose 工程升级 AGP 后 (7.0.0 > 7.0.2)重新编译发生下面错误ComposeOptions.kotlinCompilerVersion is deprecated. Compose now uses the kotlin compiler defined in your buildscript.以前需要通过该 composeOptions 指定 Kotlin 版本升级后,直接复用 buildScript 的 Kotlin 版本, composeOptio原创 2021-11-06 20:23:37 · 3290 阅读 · 0 评论 -
展望2022:Android开发技术动向
每年9/10月份 Google 都会举行为期约2天的 Android Dev Summit,在活动上 Google 的技术专家们会分享一些 Android 领域的技术动向以及开发心得。今年 Summit 的 Slogan 是 “Excellent apps,across devices” , 即使用 Jetpack 等 MAD Skill (Moden Android Development) 开发出更优秀的应用,并通过 Android 系统落地到更多种类的智能设备。本次活动围绕这一主旨做了 30 多场原创 2021-11-04 18:37:13 · 1918 阅读 · 0 评论 -
Jetpack Compose 中使用 Lottie 动画
从事 Android 开发的 都知道 airbnb 的 Lottie 库,如今它也支持在 Jetpack Compose 中使用了原创 2021-09-27 03:44:26 · 1686 阅读 · 0 评论 -
【Android】我用 ARCore 做了一个 1:1 的高达
借助 ARCore 和 Sceneform 在 Android 手机上轻松实现一个 1:1 的高达,效果惊艳!原创 2021-09-10 17:25:52 · 1981 阅读 · 4 评论 -
Kotlin1.5 新特性之 Sealed Interface(密封接口)
Kotlin 1.5 推出了密封接口(Sealed Interface),这与密封类(Sealed Class)有什么区别呢?在开始聊密封接口之前先回顾一下密封类的进化史。密封类的进化史密封类可以约束子类的类型,类似于枚举类,但相对于枚举更加灵活:Enum Class:每个枚举都是枚举类的实例,可以直接使用Sealed Class:密封类约束的子类只是一个类型,你可以为不同子类定义方法和属性,并对齐动态实例化Kotlin 1.0早期 Kotlin 1.0 中的密封类,子类型必须是密封.原创 2021-06-16 01:48:06 · 3895 阅读 · 1 评论 -
Kotlin 更新了Roadmap,未来会有哪些新变化?
Kotlin的Roadmap每半年会进行一次更新,从中开发者可以观察到Kotlin团队未来的规划和工作重心。近期Kotlin又更新了Roadmap,让我们看一下Kotlin团队未来又规划了哪些新项目。全新的Kotlin编译器为了提高Kotlin编译性能,Kotlin团队计划重写编译器前端,待重写完成编译速度将有望翻倍。为了配合新的编译器前端架构,现有的JVM、JS等编译器后端也需要重新实现。新的JVM后端已于近期完成并发布,其他工作还在进行中。此外,新的编译器将提供更好用的 Compiler Plu.原创 2021-06-07 15:43:38 · 963 阅读 · 1 评论 -
Kotlin 1.5 新特性 Inline classes,还不了解一下?
Kotlin 1.5 中 Inline classes 终于迎来稳定版本,在提高代码可读性、易用性的同时,不会造成性能损失,值得大家学习和广泛使用原创 2021-05-07 12:38:07 · 7069 阅读 · 25 评论 -
Jetpack Compose迎来Beta版!!快来参加Android开发挑战赛!!
Jetpack Compose迎来Beta版本近日,Jetpack Compose发布了第一个beta版本1.0.0-beta01,官方Samples也第一时间进行了同步升级。通过Release Note可以看到,本次新版本跟之前历次alpha版本的迭代一样依然以大量API的调整为主,很多API名字或接口签名发生变化,此外就没什么里程碑式的更新了,所以beta01说是alpha13也不为过。这宣布着Compose进入了一个新的阶段,按照目前进度,有可能在年底之前迎来正式版的发布AndroidDevC原创 2021-02-28 00:58:04 · 569 阅读 · 4 评论 -
Kotlin Symbol Processing(KSP)使用初体验
近日,android官方发布了Kotlin Symbol Processing(KSP)的alpha版本。Announcing Kotlin Symbol Processing (KSP) Alpha为什么使用KSP?很多人在使用Kotlin时的痛点之一就是编译速度过慢。很多常见的三方库都通过注解简化模板代码,例如Room、Dagger、Retrofit等,Kotlin使用KAPT处理注解,KAPT没有专门的注解处理器,需要借助APT实现的,因为APT只能处理Java,所以KAPT需要生成A.原创 2021-02-18 16:02:27 · 6738 阅读 · 1 评论 -
关于Jetpack Compose重绘(Recomposition)的一个坑
最近尝鲜Jetpack Compose时,踩了一个坑,可能是很多人都容易忽略的问题,特此记录一下。当前最新版本: 1.0.0-alpha11Compose重绘关于Compose的重绘(Recomposition),官方是这样介绍的:Recomposition skips as much as possibleWhen portions of your UI are invalid, Compose does its best to recompose just the portions th.原创 2021-02-14 12:35:50 · 1855 阅读 · 4 评论 -
如何在Java代码中更优雅地调用Kotlin
Kotlin与Java良好的互操作性是其能够快速普及的原因之一。从Java虽然可以访问Kotlin,但是通过下面这些技巧可以让对Kotlin的访问变得更加友好和地道@JvmStaticKotlin中可以使用object class创建单例object Analytics { fun init() {...} fun send(event: Event) {...} fun close() {...}}Kotlin侧可以像Java的静态方法一样访问其方法Analytics.se.原创 2021-02-06 14:43:10 · 3018 阅读 · 0 评论 -
基于Redux和Kotlin Multiplatform打造跨平台移动应用
客户端的跨平台技术早已屡见不鲜,在UI层面,native开发在用户体验等方面仍然占据优势;但是在逻辑层,通过Kotlin Multiplatform等跨平台技术确实可以通过维护一套代码提高开发效率。引入跨平台技术后,该如何选择一个适合的开发范式也成为了新的课题。近期有国外同行通过一个Sample App提出了使用ReduxKotlin打造Kotlin跨平台APP的思路,或许值得大家借鉴。原文地址:https://blog.dreipol.ch/trash-disposal-with-kotlin-mu.原创 2021-01-27 02:54:39 · 548 阅读 · 1 评论 -
【Android】Coil:为kotlin而生的图片库
Coil可以配合Kotlin协程实现图片加载,非常适合在Kotlin/Android项目中使用:加载性能好缓存管理(MemCache、DiskCache)、动态采样(Dynamic image sampling)、加载中暂停/终止等功能有助于提高图片加载效率体积小其包体积与Picasso相当,显著低于Glide和Fresco,仅仅只有1500个方法,但是在功能上却不输于其他同类库简单易用配合Kotlin扩展方法等语法优势,API简单易用技术先进基于Coroutine、OkHttp、Ok.原创 2021-01-24 01:47:36 · 5573 阅读 · 4 评论 -
Android+Kotlin中实践Clean Architecture
Clean ArchitectureClean Architecture 由Robert C. Martin(Uncle Bob)发布于2012年 :http://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html目前被作为项目结构组织的最佳范式被广泛熟知,连Android官方的MVVM示例项目中也有所使用。Clean架构很好地实践了SLOID原则,具有以下优点分层设计贯彻了关注点分离高度抽象,适用于各类型翻译 2021-01-02 19:38:12 · 1261 阅读 · 0 评论 -
Kotlin + ReentrantLock
Synchronized or ReentrantLock?kotlin虽然没有Synchronized关键字,但是提供了同名的inline函数,可以应付一般的多线程同步场景。private val lock = Object()...synchronized(lock) { ...}但是kotlin的synchronized只能兼容jvm平台,所以在跨平台时无法使用,目前已经被Deprecated在这,Object的notify、wait等方法Kotlin中也无法使用; Sync原创 2021-01-02 17:25:42 · 1344 阅读 · 0 评论 -
Jetpack Compose for Desktop 初体验
不久前,Jetpack Compose for Desktop发布,未来使用Compose可以在macOS/Linux/Windows等平台像Flutter、React那样进行声明式UI开发了,而且是使用Kotlin语言。这对于广大Android开发者是一个福音。有兴趣的同学可以前去 Compose for Desktop, by JetBrains 进行体验。本文针对项目的Sample做一个介绍运行环境macOS Catalina 10.15.7IntelliJ IDEA 2020.3 (C原创 2020-12-26 15:15:40 · 4328 阅读 · 8 评论 -
【Android Jetpack】使用Kotlin DSL配置Navigation Components
想要在APP中使用Jetpack的Navigation组件进行页面跳转,需要事先为其配置NavGraph基于XML配置通常可以使用xml进行配置,例如官方sunflower例子中的nav_garden.xml<!-- nav_garden.xml --><navigation xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/.原创 2020-12-05 14:12:47 · 523 阅读 · 0 评论 -
Kotlin Android Extensions遭废弃,官方推荐使用ViewBinding
https://youtrack.jetbrains.com/issue/KT-42121As the @Parcelize functionality is extracted (KT-42120), the rest of the Android Extensions functionality can be deprecated in favour of View Binding.The existing Android Extensions plugin will continue to w..原创 2020-11-22 01:15:58 · 4642 阅读 · 10 评论 -
玩转Kotlin类内部扩展函数
Kotlin的扩展函数,既可以定义在Top-level,也可以定义在Class内。类内部扩展函数虽然使用起来多了限制,但是避免了对top-level的污染,可以看做为扩展函数增加了作用域或者namespace,使用得当的话也是非常有用的。基本使用class SquareScope { fun Int.square(): Int = this * this}上面扩展函数定义在SquareScope内部,无法直接在top-level直接使用。@Testfun test() { pri.原创 2020-11-07 22:27:52 · 610 阅读 · 0 评论 -
【Kotlin】告别KAPT,拥抱KSP API
Kotlin Compiler PluginKotlin提供了编译器插件Compiler Plugin,可以在编译期通过分析和修改AST修改最终生成的字节码。相对于APT或者Transform等方式效率更高。Kotlin很多语法关键字以及注解都是基于KotlinCompilerPlugin实现的,例如data class、@Parcelize、、kotlin-android-extension 等。开发Compiler Plugin需要涉及一些编译器知识:例如需要了解编译器前、后端产物及相关API.原创 2020-11-01 23:28:16 · 1982 阅读 · 0 评论 -
【Android】源码分析ViewModel如何实现横竖屏切换时不销毁
ViewModelViewModel是Android Jetpack中的重要组件,其优势是具有下图这样的生命周期、不会因为屏幕旋转等Activity配置变化而销毁,是实现MVVM架构中UI状态管理的重要基础。class HogeActivity : AppCompatActivity { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) Log.d(T.原创 2020-10-24 13:30:27 · 1614 阅读 · 0 评论 -
【Kotlin】this还是it?合理使用with操作符
使用with优化代码在这里插入代码片下面是一段常见的UI配置逻辑:applicationWindow.title = "Just an example"applicationWindow.position = FramePosition.AUTOapplicationWindow.content = createContent()applicationWindow.show()applicationWindow需要反复调用,此时我们可以with进行优化,使代码更加简洁易读with(app.原创 2020-10-18 22:00:39 · 1968 阅读 · 0 评论 -
Roman大神带你了解Kotlin如何实现自我进化
Kotlin团队的大牛Roman Relizarov再最近的一个演讲中,介绍了一些从众多开发者中收集到的且目前呼声很高的新的语法特性,其中一些优秀的想法很可能会在未来的某个版本中出现https://youtu.be/0FF19HJDqMo那么有哪些优秀的设计呢? 让我们先睹为快!YouTrack&KEEPKotlin团队通过YouTrack收集和跟踪各种来自开发者们的意见和建议,其中一些准入的项目会进入KEEP进行管理。所以很多新的语法特性最早都是出现在YouTrack中,并通过一个KT.原创 2020-10-17 15:20:58 · 255 阅读 · 0 评论 -
【Android】用Kotlin方式使用ActionMode
ActionModeActionMode模式为在页面产生一个悬浮的类似于ActionBar的控件,悬浮在ActionBar之上,可以在不占用页面空间的情况下增加功能入口。ActionMode有两种模式Primary Action :控件覆盖出现在上方ActionBar之上Floating Action:控件浮动出现在任意View的四周Primary ActionFloating Action启动方式通过Activity或者View的startActionMod原创 2020-10-06 11:38:44 · 647 阅读 · 0 评论 -
【Kotlin协程】避免在suspend函数中使用@Synchronized修饰符
使用Kotlin时,我们通常使用@Synchronized实现线程间同步,因此很多刚接触协程的同学,视图在挂起函数上添加@Synchronized以实现”协程间同步”,这是否有效呢?1. 协程+Synchronized ?通常,协程可以帮助我们执行并行任务:suspend fun doSomething(i: Int) { println("#$i enter critical section.") // do something critical delay(1000).原创 2020-10-05 20:13:52 · 3245 阅读 · 0 评论 -
【Android】FlowBinding: 使用Coroutine Flow打造响应式UI
RxBinding如今的Android开发中越来越多地开始引进MVI、Redux、单向数据流等概念,力求实现像react等前端框架那样的响应式UI开发体验。除了彻底转向Jetpack Compose那样的激进方案外,客户端也有一些因地制宜的方案,比如RxBinding,通过RxJava与Android View的配合,用Observable替代OnClickListener,从而更高效地实现基于事件驱动的UI开发。findViewById<Button>(R.id.button).cl.原创 2020-10-02 14:33:26 · 805 阅读 · 0 评论 -
【Android】在Kotlin中更优雅地使用LiveData
由于LiveData#Observer接口定义在Java中,且接受一个Nullable参数,导致其不能很好的兼容Kotlin的SAM以及NonNull等语法特性: viewModel.order.observe(viewLifecycleOwner, Observe { it?.let { applyCurrentOrder(it) } })Observe { .. }不能省略?.let显得非常多余现在使用lifecycle-livedata-ktx可以帮我们在Kotl.原创 2020-10-01 21:58:33 · 4244 阅读 · 1 评论