在 iOS 平台如下: actual typealias MMKV = xxx.xxx.ios.MMKV iOS 上没有包名的概念,xxx.xxx.ios 是使用 cinterop 等工具生成 Kotlin...2.5 跨端的架构模式组件尝试——MVIKotlin 我们希望找到一款能用于 KMM 上的类似于 Jetpack AAC 的架构模式组件框架来实现 MVVM 模式,但是开源社区内暂时还没有这样一款成熟可用的框架...,像 Bootstrapper 这种每次启动只会使用一次的组件也需要单独定义,在每次开发的过程中即使是很简单的业务开发者也需要编写大量样板代码。...更让人头疼的是,数据在 Store 内流转时每经过一个组件就会变一个名字,这丛概念上讲确实没有什么问题,因为数据在不同的组件间流转时从概念上来说会有区别,但在 MVIKotlin 的设计中每种概念都由一个...3.2 Kotlin/Native 调用非虚函数使用静态分派 JVM 上为了实现多态调用非虚函数的机制称为动态分派,即仅在运行时才知道被调用的函数到底是哪一个版本(继承类、实现接口会覆盖函数)。
在KMM早期推出来的时候,那个时候Compose Multiplatform还没有发布,所以大家都觉KMM很鸡肋,因为90%的开发者认为移动端的主要工作都在编写UI上,跨平台不能跨UI叫做哪门子的跨平台...这里我基于刚刚创建的KMM项目,在KMM的基础上添加Compose Multiplatform的配置。...官方给出了一些Compose Multiplatform的模版,也有Kotlin/Wasm的模板,但是唯独没有Compose Wasm for Web的模板,所以,我自己在github上开源了一个模板,...没有使用过Jetpack Compose 对于没有使用过Jetpack Compose的这部分人来说,其实我是可以完全理解的,一些组件的支持,比如地图、WebView等可能还需要一定的时间,毕竟现在使用...已经在使用Kotlin的,我建议可以学习下Jetpack Compose,一来这是一个趋势,二来它会扩展你的跨平台技能。如果你想在未来几年内仍然从事Android开发,我觉得是没有理由拒绝的。
Kotlin Multiplatform Mobile (KMM) 是由 Jetbrains 提供的跨平台移动开发 SDK 。借助 Kotlin 的 跨平台能力,你可以使用一个工程为多个平台编译。...使用 KMM,具备灵活性的同时也保留了原生编程的优势。...为 Android/iOS 应用程序的业务逻辑代码使用单一的代码库,仅在需要的时候编写平台特定代码,例如实现原生的 UI,使用平台特定 API 等等。 KMM 可以和你的工程无缝集成。...在写这篇博客的同时,KMM 仍然处于 Alpha,你可以开始尝试在你的应用中共享业务逻辑代码。 在移动开发领域,KMM 目前没有为大众所熟知。...你已经完成了你的第一个 KMM app 。
KMM用纯Kotlin编写一次代码,即可在iOS和Android上运行,开发应用的公共业务逻辑只需要编写一次。KMM减少了为不同平台编写和维护相同代码所花费的时间。...KMM SDK层:如alog、PlatformMMKV写成一个SDK可以供其他KMM模块(business)使用。...} 这样Android就可以使用fun v(tag: String, format: String, vararg args: Any?)函数,而iOS没有这个函数。...2、构建系统上构建依赖其他模块的klib包构建,业务直接pod sdkframework即可。第1种方案比较灵活,版本号可以写脚本控制,但是要求开发人员使用的电脑都要配置KMM开发环境。...6.1 sdkframework模块的iosMain需要有一个kotlin文件 如果iosMain没有kotlin文件,将无法生成 iOS framework,为其添加一个文件即可,如SDKTest.kt
搭建项目 创建项目 因为目前Compose for iOS阶段还在试验阶段,所以我们无法使用Android Studio或者IDEA直接创建Compose支持iOS的项目,这里我们采用之前的方法,先使用...不过这是KMM的iOS项目,接下来我们看如何使用Compose编写iOS页面。...实现一个双端网络请求功能 在之前的第1弹和第2弹中,我们分别实现了在Desktop、和Web端的网络请求功能,现在我们对之前的功能在iOS上再次实现。...一个尴尬的问题 我一直认为存在一个比较尴尬的问题,那就是像上面实现一个完整的双端网络请求功能需要用到KMM + Compose-jb,但是KMM与Compose-jb并不是一个东西,但是用的时候呢基本上都是一起用...Compose-jb很久之前已经发了稳定版本只是Compose-iOS目前还没有开放出来,而KMM当前还处于试验阶段,不过在2023年Kotlin的RoadMap中,Kotlin已经表示将会在23年中发布第一个稳定版本的
KMM 插件 KMM 算是 Kotlin Team 为多平台这个重磅特性挖掘的一个重要的应用场景。 ?...KMM 运行在 iOS 上的实际上就是 Kotlin Native 的代码,通过 Kotlin MPP 与运行在 Android 上的 Kotlin Jvm 代码来共享逻辑。...最近随着 Kotlin 1.4 发布推出的 KMM 插件也支持了在 Android Studio 上直接运行 iOS 应用,启动 iOS 模拟器,甚至单步调试运行在 iOS 上的 Kotlin Native...也正是如此,Kotlin 协程的 Kotlin Native 版本迟迟没有正式推出多线程版本,在 iOS 上使用 Kotlin 协程目前还受制于所调用的 API 是否本身已经自己支持了异步以及回调的线程切换...再稍微提一下,KMM 插件尽管支持了很多功能,但对于 iOS 工程却仍然不能有效支持,这主要体现在对于 Swift、Objective-C 的代码无法高亮、调试等问题上,如果需要编辑 SwiftUI 或者其他使用
一、用KMM写Flutter插件 Google官方有一个写Flutter例子How to write a Flutter plugin,这里把Google plugin_codelab 例子改成用KMM...三、设计思路 Android/iOS插件PluginCodelabPlugin只需要实现KMM Module的接口,不写任何逻辑,把逻辑通过接口放在KMM Module中。...fun notImplemented() } } 2、在KMM中的commonMain实现CommonCodelabPlugin插件的公共逻辑 CommonCodelabPlugin需要初始化并启动...KMM开发一个Flutter插件。...使用KMM开发插件的好处是公共逻辑都使用kotlin写,一般公共逻辑比较简单适合使用kotlin写,便于维护。而且,实现了KMM写插件,Flutter写UI。
前言 KMM的发展除了靠官方社区的支持外,一些大企业的开源落地也尤为重要。从这些开源中我们需要借鉴他的设计思想和实现方式。从而在落地遇到问题时,寻得更多的解决办法。...定义查询数据的方法 这里还定一个一个查询数据的方法,使用flow分发分发给UI层,代码如下所示: suspend fun produceViewModels( events: Flow<Event...Android UI层实现 Android UI层的实现比较简单,定义了一个event用于事件分发 val events = MutableSharedFlow(extraBufferCapacity...} } } } } iOS平台的实现 AppDelegate.swift文件是程序启动入口文件,RepositoryCell类继承自UICollectionViewCell,并补充了...目前我们所能做的就是持续关注KMM的动态,探索可尝试落地的组件,为己所用。
最近几周团队的 KMM 进度推进了不少,已经陆续把几个小业务需求迁移到了 KMM。 其实万事开头难,最初的时候许多公共团队基础类库都没有桥接到 KMM,导致好像啥业务都没法着手开始。...对象的 API,通常的左右是来生成一个对象(和 Java 中使用 class 的方式相似),那么这样的 API 可能对 Kotlin 类不兼容。...结语 KMM 代码发布上线在即,如果它能在线上稳定跑一到两个版本(主要担心的就是 iOS 平台),就至少可以说明 Kotlin/Native 的编译器、 runtime 以及标准库没有太大问题,当然...runtime 的坑之前不是没遇到过,例如 Kotlin/Native 没有 JVM 上的虚方法调用动态分派。...如果能证明语言层面上问题,后续 Model 层的业务逻辑就可以大规模迁移到 KMM。 后面我们可能会把精力花在研究一下 cinterop 这个工具以及 iOS 的构建系统上。
上面官方的描述说了这么多,简单的来说就是KMM注重业务逻辑跨平台,和Flutter、Compose完全相反。即使如此,在这个都想着跨别人的年代,KMM也称自己并没有说过不会做UI的跨平台......输入项目名称,选择对应的配置 在 iOS 框架分发列表中,选择常规框架选项 (这里为了简单演示,实际项目根据所需选择即可)。点击Finish就创建了一个KMM的项目。...源集是一个 Gradle 概念,用于逻辑上组合在一起的多个文件,其中每个组都有自己的依赖项。 在 Kotlin Multiplatform 中,共享模块中的不同源集可以针对不同的平台。 ...可以使用 CocoaPods 或其他依赖项管理器的原生 iOS 项目和使用 Gradle 的 Android 项目中使用。...写在最后 到这里,恭喜你,已经入门了KMM的使用,更多的使用方法需要在实际项目中不断地去总结,去尝试,Jetpack目前也在开发KMM版本,这对KMM发展将会是一个推进~
选择Flutter,最大的问题在于你选择了另一个生态,无论是从语言还是从各种支持框架,与主流流行的技术几乎没有任何重叠之处。...但原生开发这种一个APP,两端分别开发,始终在成本上是企业非常想避免的事 (虽然实际上原生开发的成本并不一定比跨平台开发多,只是大家感觉跨平台开发似乎只需要一半的成本,但这并不是事实) 于是KMM则完全从另一种思路来解决这个问题...在移动端开发中,一个显著的特征是: 不同端的业务逻辑是几乎完全一致的,只是它们的实现技术与载体不同而已 所以,KMM则基于上述这个思路,创新式的引入了另一种模式: 在保持原生开发的基础上,使业务模块重用...KMM的实现思路是重用业务。 在Android中开发业务实现,KMM会将你的业务生成iOS类库。你在iOS开发的时候,相当于依赖了一个类库,这个类库提供了本身你业务的很多方法。...这个项目主要是: • 最小化的示例及说明如何基于KMM进行开发 • 示例是一个最小骨架的尝试,包括APP的UI,从服务器获取数据,将数据存储到数据库都包含在内 • 实现了Android与iOS两端的开发
* 如果上下文没有任何dispatcher,也没有任何其他[ContinuationInterceptor],则[Dispatchers.]默认使用“Default”。...; 代码示例 : DEFAULT 模式的协程可以被取消 ; runBlocking { // 调用 runBlocking 函数 , 可以将 主线程 包装成 协程 // 指定协程的启动模式为...* * 这与[ATOMIC]在某种意义上类似,协程开始执行,即使它已经被取消, * 但不同的是,它在同一个线程中开始执行。...* * 无限制事件循环 * * 与调度程序。和[MainCoroutineDispatcher。]...,嵌套的未分派协程不会形成 * 在无限制嵌套的情况下防止潜在堆栈溢出的事件循环。
一、Channel Channel相较于Flow,Flow是冷流,本质上可以说是一个单线程操作,只有开始收集时,上流代码才会启动,而Channel是一个并发安全的队列,可以用来连接不同的协程,实现不同协程之间的通信...1.Channel的使用 创建一个Channel对象,在不同协程中调用其send和receive函数 fun `test channel`() = runBlocking { val channel...produce启动一个生产者协程,并返回ReceiveChannel fun `test channel produce`() = runBlocking { val receiveChannel...actor启动一个消费者协程 fun `test channel acotr`() = runBlocking { val sendChannel = GlobalScope.actor的,只有SelectCauseN类型的事件 1.SelectCause0:对应事件没有返回值,例如join,那么onJoin就是SelectCauseN,使用时,onJoin的参数是一个无参函数
Compose 能应用于跨平台,主要是基于 KMM 架构,KMM 的介绍可以查看官方文档《Get started with Kotlin Multiplatform Mobile[1]》,我们来看下 KMM...实现这个方法,这样,在不同的平台集成 KMM 时就可以实现各自平台的效果。...KMM 架构可以实现各端的通用逻辑,那基于 KMM 的 Compose 主要目的是为了实现各平台的 ui 统一。...jb-compose 来实现 ui 复用 web 是自己实现了一套 Compose UI 逻辑,ui 组件依赖的是 web-core-js,所以,无法与其他端复用 iOS 暂时没有实现 Compose...来实现组件路由,但该组件 jb 并没有移植到 jb-compose 中,所以,无法在两个平台上实现复用,好在浏览 jb-compose 项目的 issue 时找到了一个可替代的方案 Decompose
它启动了一个新的协程作用域并且在所有子协程执行结束后并没有执行完毕。 ...// runBlocking 和 coroutineScope 主要的不同之处在于后者在等待所有的子协程执行完毕时并没有使当前线程阻塞 private fun testCoro() = runBlocking...,可以追踪一个job引用,并手动的启动一个单独的协程在延迟后取消追踪, // 但这里会抛出一个TimeoutCancellationException异常 private fun showTwo...,这个协程是轻量级的,与其他协程一起并发工作,与launch启动协程不同,launch启动返回一个Job对象 // 不带有任何返回值,而async返回一个Defrred对象一个轻量级非阻塞future...,它确定相应的协程在执行时使用一个或多个线程,协程调度器会让协程执行在指定的局部线程中,调用它 //运行在线程池中或者不受它限制运行 fun testDispatcher() = runBlocking
Coroutine是kotlin官方文档上推荐的,个人理解,其实就是一个轻量级的线程库。...delay,yield是一个好的选择。 第二种方法是显式的检查取消状态。 所以,打印没结束就是因为launch内部没有挂起函数。...现在一个很重要的问题就是 CancellationException 好像并没有在控制台显式的展示出来。...Dispatchers.Unconfined 是一个特殊的调度器且似乎也运行在 main 线程中,但实际上, 它是一种不同的机制,这会在后文中讲到。...当协程在 GlobalScope 中启动时,使用的是由 Dispatchers.Default 代表的默认调度器。 默认调度器使用共享的后台线程池。
,启动一个新的协程后台任务,并返回一个Job类型的对象作为当前协程的引用。...Hello, 另外, 我们不能使用Thread来启动协程代码。...14:38:02.763: T2 Hello, 14:38:04.738: T4 可以发现,运行结果跟之前的是一样的,但是我们没有使用Thread.sleep,我们只使用了非阻塞的delay函数。...9.6 协程执行的取消 我们知道,启动函数launch返回一个Job引用当前协程,该Job引用可用于取消正在运行协程: fun testCancellation() = runBlocking循环调用一个挂起函数yield() 该方法实质上是通过job的isCompleted状态值来捕获CancellationException完成取消功能。
)上生成证书和描述文件3.ios开发者账号(我申请了一年688人民币,个人账号)4.HbuilderX开发工具,用来封装(。...wgt)并开发第二,申请ios的App ID和外包专用密码1.开发者账号,登录developer.apple.com/account/res…申请ios的app ID(app的唯一ID) 2.1选择标识符并单击要创建的编号...第五,放到App Store上1.开发者账户登录https://Appstoreconnect.Apple.com/,选择我的应用,点击数字,创建一个新的应用。...2.填写app的基本信息钥匙钥匙钥匙3360预览和截图中上传的尺寸要按要求;如果只发布手机,不发布iPad,就不要发iPad大小的图片;技术支持网站自己建立一个H5网站,技术支持电话号码必须写在这个网站上...附件:用手机录屏,这是你app的基本操作。如果app使用相册、扫描、麦克风等功能,一定要在HbuilderX的mainfest.json文件中描述清楚3.填写完以上信息后,点击右上角的‘保存’。
download.php)上生成证书和描述文件 3.ios开发者账号(我申请了一年688人民币,个人账号) 4.HbuilderX开发工具,用来封装(。...wgt)并开发 第二,申请ios的App ID和外包专用密码。...第五,放到App Store上 1.开发者账户登录https://Appstoreconnect.Apple.com/,选择我的应用,点击数字,创建一个新的应用。...2.填写app的基本信息 钥匙钥匙钥匙3360 预览和截图中上传的尺寸要按要求; 如果只发布手机,不发布iPad,就不要发iPad大小的图片; 技术支持网站自己建立一个H5网站,技术支持电话号码必须写在这个网站上...如果app使用相册、扫描、麦克风等功能,一定要在HbuilderX的mainfest.json文件中描述清楚 3.填写完以上信息后,点击右上角的‘保存’。最后一步是构建版本。
)上生成证书和描述文件 3.ios开发者账号(我申请了一年688人民币,个人账号) 4.HbuilderX开发工具,用来封装(。...wgt)并开发 第二,申请ios的App ID和外包专用密码。...第五,放到App Store上 1.开发者账户登录https://Appstoreconnect.Apple.com/,选择我的应用,点击数字,创建一个新的应用。...2.填写app的基本信息 钥匙钥匙钥匙3360 1)预览和截图中上传的尺寸要按要求; 2)如果只发布手机,不发布iPad,就不要发iPad大小的图片; 3)技术支持网站自己建立一个H5网站,技术支持电话号码必须写在这个网站上...5)如果app使用相册、扫描、麦克风等功能,一定要在HbuilderX的mainfest.json文件中描述清楚 3.填写完以上信息后,点击右上角的‘保存’。最后一步是构建版本。
领取专属 10元无门槛券
手把手带您无忧上云