首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

干货 | 携程机票 App KMM 跨端生产实践

在 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 上为了实现多态调用非虚函数的机制称为动态分派,即仅在运行时才知道被调用的函数到底是哪一个版本(继承类、实现接口会覆盖函数)。

3.7K10

谷歌社区说|聊聊Compose跨平台与KMM

在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开发,我觉得是没有理由拒绝的。

1.4K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    KotlinNative KMM项目架构

    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

    3.3K00

    Compose也能开发iOS了,快来体验~

    搭建项目 创建项目 因为目前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年中发布第一个稳定版本的

    1.4K30

    说说最近官方公布的 Kotlin 的动态

    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 或者其他使用

    1.3K30

    再探Kotlin 跨平台——迁移Paging分页库至KMM

    前言 KMM的发展除了靠官方社区的支持外,一些大企业的开源落地也尤为重要。从这些开源中我们需要借鉴他的设计思想和实现方式。从而在落地遇到问题时,寻得更多的解决办法。...定义查询数据的方法 这里还定一个一个查询数据的方法,使用flow分发分发给UI层,代码如下所示: suspend fun produceViewModels(     events: Flow<Event...Android UI层实现 Android UI层的实现比较简单,定义了一个event用于事件分发 val events = MutableSharedFlow(extraBufferCapacity...}       }     }   } } iOS平台的实现 AppDelegate.swift文件是程序启动入口文件,RepositoryCell类继承自UICollectionViewCell,并补充了...目前我们所能做的就是持续关注KMM的动态,探索可尝试落地的组件,为己所用。

    1.2K20

    KMM 求生日记二:KotlinNative 被踩中的坑

    最近几周团队的 KMM 进度推进了不少,已经陆续把几个小业务需求迁移到了 KMM。 其实万事开头难,最初的时候许多公共团队基础类库都没有桥接到 KMM,导致好像啥业务都没法着手开始。...对象的 API,通常的左右是来生成一个对象(和 Java 中使用 class 的方式相似),那么这样的 API 可能对 Kotlin 类不兼容。...结语 KMM 代码发布上线在即,如果它能在线上稳定跑一到两个版本(主要担心的就是 iOS 平台),就至少可以说明 Kotlin/Native 的编译器、 runtime 以及标准库没有太大问题,当然...runtime 的坑之前不是没遇到过,例如 Kotlin/Native 没有 JVM 上的虚方法调用动态分派。...如果能证明语言层面上问题,后续 Model 层的业务逻辑就可以大规模迁移到 KMM。 后面我们可能会把精力花在研究一下 cinterop 这个工具以及 iOS 的构建系统上。

    2.7K10

    KMM跨平台开发入门,看这一篇就够了~

    上面官方的描述说了这么多,简单的来说就是KMM注重业务逻辑跨平台,和Flutter、Compose完全相反。即使如此,在这个都想着跨别人的年代,KMM也称自己并没有说过不会做UI的跨平台......输入项目名称,选择对应的配置 在 iOS 框架分发列表中,选择常规框架选项 (这里为了简单演示,实际项目根据所需选择即可)。点击Finish就创建了一个KMM的项目。...源集是一个 Gradle 概念,用于逻辑上组合在一起的多个文件,其中每个组都有自己的依赖项。 在 Kotlin Multiplatform 中,共享模块中的不同源集可以针对不同的平台。 ...可以使用 CocoaPods 或其他依赖项管理器的原生 iOS 项目和使用 Gradle 的 Android 项目中使用。...写在最后 到这里,恭喜你,已经入门了KMM的使用,更多的使用方法需要在实际项目中不断地去总结,去尝试,Jetpack目前也在开发KMM版本,这对KMM发展将会是一个推进~

    4.7K20

    别具特色的跨平台移动开发 - Kotlin Multiplatform Mobile

    选择Flutter,最大的问题在于你选择了另一个生态,无论是从语言还是从各种支持框架,与主流流行的技术几乎没有任何重叠之处。...但原生开发这种一个APP,两端分别开发,始终在成本上是企业非常想避免的事 (虽然实际上原生开发的成本并不一定比跨平台开发多,只是大家感觉跨平台开发似乎只需要一半的成本,但这并不是事实) 于是KMM则完全从另一种思路来解决这个问题...在移动端开发中,一个显著的特征是: 不同端的业务逻辑是几乎完全一致的,只是它们的实现技术与载体不同而已 所以,KMM则基于上述这个思路,创新式的引入了另一种模式: 在保持原生开发的基础上,使业务模块重用...KMM的实现思路是重用业务。 在Android中开发业务实现,KMM会将你的业务生成iOS类库。你在iOS开发的时候,相当于依赖了一个类库,这个类库提供了本身你业务的很多方法。...这个项目主要是: • 最小化的示例及说明如何基于KMM进行开发 • 示例是一个最小骨架的尝试,包括APP的UI,从服务器获取数据,将数据存储到数据库都包含在内 • 实现了Android与iOS两端的开发

    1.7K20

    【Kotlin 协程】协程启动 ④ ( 协程启动模式 | 协程构建器启动模式参数 | DEFAULT 模式 | ATOMIC 模式 | LAZY 模式 | UNDISPATCHED 模式 )

    * 如果上下文没有任何dispatcher,也没有任何其他[ContinuationInterceptor],则[Dispatchers.]默认使用“Default”。...; 代码示例 : DEFAULT 模式的协程可以被取消 ; runBlocking { // 调用 runBlocking 函数 , 可以将 主线程 包装成 协程 // 指定协程的启动模式为...* * 这与[ATOMIC]在某种意义上类似,协程开始执行,即使它已经被取消, * 但不同的是,它在同一个线程中开始执行。...* * 无限制事件循环 * * 与调度程序。和[MainCoroutineDispatcher。]...,嵌套的未分派协程不会形成 * 在无限制嵌套的情况下防止潜在堆栈溢出的事件循环。

    1.1K10

    kotlin--Channel、多路复用、并发安全

    一、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的参数是一个无参函数

    1K10

    Compose 跨平台现状

    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

    3.5K30

    Kotlin 协程之Practice

    它启动了一个新的协程作用域并且在所有子协程执行结束后并没有执行完毕。     ...// runBlocking 和 coroutineScope 主要的不同之处在于后者在等待所有的子协程执行完毕时并没有使当前线程阻塞     private fun testCoro() = runBlocking...,可以追踪一个job引用,并手动的启动一个单独的协程在延迟后取消追踪,     // 但这里会抛出一个TimeoutCancellationException异常     private fun showTwo...,这个协程是轻量级的,与其他协程一起并发工作,与launch启动协程不同,launch启动返回一个Job对象     // 不带有任何返回值,而async返回一个Defrred对象一个轻量级非阻塞future...,它确定相应的协程在执行时使用一个或多个线程,协程调度器会让协程执行在指定的局部线程中,调用它     //运行在线程池中或者不受它限制运行     fun testDispatcher() = runBlocking

    1.2K20

    Uni开发的app,使用Windows S10,放在ios上,全程跟着一个马平川。

    )上生成证书和描述文件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.填写完以上信息后,点击右上角的‘保存’。

    47441

    Uni开发的app,使用Windows S10,放在ios上,全程跟着一个马平川

    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.填写完以上信息后,点击右上角的‘保存’。最后一步是构建版本。

    33820

    Uni开发的app,使用Windows S10,放在ios上,全程跟着一个马平川。

    )上生成证书和描述文件 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.填写完以上信息后,点击右上角的‘保存’。最后一步是构建版本。

    30930
    领券