由于KMM还不是特别的成熟,所以建议开发者将Kotlin插件也升级到最新版本,避免出现一些兼容性问题。...共享模块由三个源集组成:androidMain、commonMain 和 iosMain。 源集是一个 Gradle 概念,用于逻辑上组合在一起的多个文件,其中每个组都有自己的依赖项。...在 Kotlin Multiplatform 中,共享模块中的不同源集可以针对不同的平台。 如下图所示。 支持多个目标的多平台库,可以在公共源集 commonMain 中使用。...这个结果来自shared模块中commonMain下的Greeting文件,代码如下所示。...写在最后 到这里,恭喜你,已经入门了KMM的使用,更多的使用方法需要在实际项目中不断地去总结,去尝试,Jetpack目前也在开发KMM版本,这对KMM发展将会是一个推进~
在 KMM 的帮助下,您可以在 iOS 和 Android 应用程序之间共享通用代码,并仅在必要时编写特定于平台的代码。...如果使用现有的Android/iOS SDK,如何实现呢?...6.1 sdkframework模块的iosMain需要有一个kotlin文件 如果iosMain没有kotlin文件,将无法生成 iOS framework,为其添加一个文件即可,如SDKTest.kt...export来导出到sdkframework.h头文件中 sdkframework依赖了utils、alog、PlatformMMKV、business,需要添加export,把这几个模块的类和方法导出到...那如何避免这个问题,可以先把utils、alog、PlatformMMKV、business模块在构建系统上构建成klib,sdkframework依赖各个模块的klib即可。
Compose 能应用于跨平台,主要是基于 KMM 架构,KMM 的介绍可以查看官方文档《Get started with Kotlin Multiplatform Mobile[1]》,我们来看下 KMM...的简单架构: commonMain 为通用层模块,也可以被称为平台无关层,如果 commonMain 涉及到平台相关操作的话,则需要定义 expect 方法,让 xxxMain 模块去 actual...从 KMM 架构可以看出,一些通用的逻辑计算完全可以丢进 commonMain 来实现,以此来达到各端只维护一份代码的目的,也算是提效了。...KMM 架构可以实现各端的通用逻辑,那基于 KMM 的 Compose 主要目的是为了实现各平台的 ui 统一。...层使用的通用模块,jetpack-compose 为 Android 所集成的平台模块,compose-desktop 为 desktop 所集成的平台模块,: 既然是拷贝 jetpack compose
通过KMM,开发者可以在 iOS 、 Android、Desktop与Web 应用程序之间共享业务逻辑的通用代码,在必要时也可以编写特定于平台的代码。所以,KMM只负责跨平台下的业务逻辑部分。...公共业务逻辑 双端完全可以共用的逻辑我们直接放在commonMain文件夹下即可。开源库的依赖我们写在commonMain目录下。...首先我们要在commonMain中使用expect定义这个接口 然后我们在shares模块下的androidMain、iOSMain目录下各自实现打开蓝牙的方法。...那么到这里呢,KMM我们就了解的差不多了,从上面的了解可以看出 其实KMM当前是可以使用在实际项目中的,不过我们可以再等等,Kotlin的RoadMap中说今年会发布正式版本,我们可以一起期待一下。...这里我基于刚刚创建的KMM项目,在KMM的基础上添加Compose Multiplatform的配置。
项目,如果你不知道如何创建一个KMM项目,可以参照之前的这篇文章KMM的初次尝试~ ,项目目录结构如下所示。...创建好KMM项目后我们需要添加Compose跨平台的相关配置。...不过这是KMM的iOS项目,接下来我们看如何使用Compose编写iOS页面。...实现一个登录页面 因为页面这部分是公用的,所以我们在shared模块下的commonMain文件夹下新建Login.kt文件,编写一个简单的登录页面,代码如下所示: @Composable internal...添加网络请求配置 首先在shared模块下的build文件中添加网络请求相关的配置,这里网络请求我们使用Ktor,具体的可参照之前的文章:KMM的初次尝试~ 配置代码如下所示: val commonMain
共享代码,使用 Kotlin 编写,使用 Kotlin/JVM 编译成 JVM 字节码,使用 Kotlin/Native 编译成二进制,所以你可以和使用其他一般类库一样使用 KMM 业务逻辑模块。...在写这篇博客的同时,KMM 仍然处于 Alpha,你可以开始尝试在你的应用中共享业务逻辑代码。 在移动开发领域,KMM 目前没有为大众所熟知。...Jetbrains 开发了 Android Studio 的 KMM 插件 来帮助你快速设置 KMM 工程。插件还可以帮助你编写,运行,测试共享代码。...shared 模块的源代码按三个源集进行分类: commonMain 下存储为所有平台工作的代码,包括 expect 声明 androidMain 下存储 Android 的特定代码,包括 actual...实现 iosMain 下存储 iOS 的特定代码,包括 actual 实现 每一个源集都有自己的依赖,Kotlin 标准库依赖会自动添加到所有源集,你不需要在编译脚本中声明。
在日常开发中,会遇到以下几个问题: 基础模块逻辑相对复杂,多端研发成本高 双端逻辑代码膨胀,无法保证完全一致,问题排查难 逻辑代码穿插在各个模块中,现有跨端复用方案迁移成本高 这些问题可能很多存量 App...在下文中,我会多次提到 KMM 这个简称,这里先简单讲一下 KMM 是什么: 基于 KMP(Kotlin Multiplatform)派生,全称 Kotlin Multiplatform Mobile。...官方给出的基础结构是一个 commonMain 的代码包,其他平台的代码包依赖它(jvmMain、jsMain 等)。...对于 KMM 工程来说,通过 Android Studio KMM 插件生成的结构是这样的: 如何扩展原生能力 先举一个最简单的例子,实现一个双端的 Log 工具。...在 commonMain 里定义好 expect fun,然后分别在 iosMain 和 androidMain 中实现 actual fun。
模型 与AndroidX下的Paging设计一样,paging-common模块提供存储层、视图模型层;paging-runtim模块提供UI层。...Paging库,可以参考许久之前我写的两篇相关文章: 在View中使用Paging3分页库 在Compose中使用分页库 接下来我们就以multiplatform-paging-samples为例,来看如何实现在...项目架构 从项目架构中可以看出在共享模块中,只有iosMain并没有AndroidMain,这是因为我们前面所讲到的针对Android平台是可以无缝迁移的。...接着我们再来看shared模块中的通用逻辑。 commonMain通用逻辑 models.kt文件中定义了若干数据结构,部分代码如下所示。...目前我们所能做的就是持续关注KMM的动态,探索可尝试落地的组件,为己所用。
一、用KMM写Flutter插件 Google官方有一个写Flutter例子How to write a Flutter plugin,这里把Google plugin_codelab 例子改成用KMM...二、如何运行 Github项目地址:kmm-flutter-plugin Android: run shared/plugin_codelab/example/android iOS: 1、build...三、设计思路 Android/iOS插件PluginCodelabPlugin只需要实现KMM Module的接口,不写任何逻辑,把逻辑通过接口放在KMM Module中。...fun notImplemented() } } 2、在KMM中的commonMain实现CommonCodelabPlugin插件的公共逻辑 CommonCodelabPlugin需要初始化并启动...successResult:(id _Nullable)result { if (_flutterResult) { _flutterResult(result); } } @end 到这里
子模块,分别是 Android app 与 KMM module。...KMM 作为一个独立的工程需要依赖基础库,且机票业务 bundle 依赖 KMM 跨端共享业务逻辑工程。...无论是新建独立 KMM App工程,还是基于现有 App工程集成 KMM 模块,KMM 子工程模块生成的 AAR 或 JAR 文件产物,均可发布上传至指定的 Maven 源仓库,进行集中依赖管理。...nativeInterop/cinterop/xxx.def") packageName = "xxx" } def 文件示例中 libraryPaths 和 compilerOpts 参数涉及到跨工程模块的文件路径引用...机票 KMM 工程作为一个无需兼容旧代码的新工程,决定直接封装 MMKV API 来作为工程的底层存储框架,这里作为一个简单的 demo 来说明如何桥接封装现有的 Android、iOS 库。
当然,我这篇文章不是来对比这两个技术的,而是来介绍另一个新的移动跨平台技术的选择 -- KMM KMM KMM的全称是:Kotlin Multiplatform Mobile,它是jetbrains公司的产品...: 不同平台共享业务逻辑的同时又保持各自原生的UI实现 这就是它最大的与众不同之处。...在移动端开发中,一个显著的特征是: 不同端的业务逻辑是几乎完全一致的,只是它们的实现技术与载体不同而已 所以,KMM则基于上述这个思路,创新式的引入了另一种模式: 在保持原生开发的基础上,使业务模块重用...而KMM也是我关注的一个移动开发技术方向,因为它一方面重用了业务,另一方面又维持了原生开发,似乎是个挺不错的实现思路。 最近五一假期时,基于KMM做了一个可运行的示例项目。...这个项目主要是: • 最小化的示例及说明如何基于KMM进行开发 • 示例是一个最小骨架的尝试,包括APP的UI,从服务器获取数据,将数据存储到数据库都包含在内 • 实现了Android与iOS两端的开发
Kotlin 的发版节奏 过去 Kotlin 的版本节奏一直比较佛系,从 1.0 到 1.1 花了一年多,到 1.2 才半年,到 1.3 又近一年,1.4 却花了将近两年。为什么会这样呢?...KMM 插件 KMM 算是 Kotlin Team 为多平台这个重磅特性挖掘的一个重要的应用场景。 ?...所以 KMM 简直就是众望所归。...KMM 运行在 iOS 上的实际上就是 Kotlin Native 的代码,通过 Kotlin MPP 与运行在 Android 上的 Kotlin Jvm 代码来共享逻辑。...Swift 编写的代码模块,还是需要在 Xcode 当中完成。
app 模块依赖一个包含了共享的代码和资源以及第三方库的 core 模块。...在 Plaid 应用内我们使用已验证后的 about 功能模块作为 Dagger 的练习模块。这里我们可以添加 Dagger 而不会干扰到其他模块或负载。你可以在这里查看初始提交。...让我们仔细地研究下应用和动态功能模块如何彼此依赖。一个动态功能模块知道 application 模块的存在。application 模块大致知道动态功能模块的存在,但是不能直接执行该模块的代码。...下一步要做什么 读完这篇文章,你可以看到模块化你的应用需要把依赖注入考虑进去。引入的功能模块边界通过分离的依赖图反映在依赖注入中。意识到这个限制可有助于为共享组件找到合适的位置。...你可以深入到代码中来查看我们如何使用 Dagger 解决 Plaid 中的依赖注入问题。
发布开源组件到 MavenCentral 仓库超详细攻略 文章中,我们已经讨论过如何发布组件到 Nexus 企业私有仓库或 MavenCentral 中央仓库的方法。...---- 目录 1、如何声明依赖版本?...如何声明依赖版本?...当一个组件被添加到依赖关系图中时,还会递归地解析该组件所依赖的其他组件,同时将「间接依赖」也添加到依赖关系图中,直到组件自身没有依赖时终止。...3.1 对比 Maven 和 Gradle 的解析策略 不同的构建系统设计的解析策略不同,我们以 Maven 为对比: Maven 最短路径策略 Maven 构建系统会采用最短路策略,构建系统会选择从根模块到依赖项的最短路来选择版本
app 模块依赖一个包含了共享的代码和资源以及第三方库的 core 模块。 ?...在 Plaid 应用内我们使用已验证后的 about 功能模块作为 Dagger 的练习模块。这里我们可以添加 Dagger 而不会干扰到其他模块或负载。你可以在这里查看初始提交。...让我们仔细地研究下应用和动态功能模块如何彼此依赖。一个动态功能模块知道 application 模块的存在。application 模块大致知道动态功能模块的存在,但是不能直接执行该模块的代码。...下一步要做什么 读完这篇文章,你可以看到模块化你的应用需要把依赖注入考虑进去。引入的功能模块边界通过分离的依赖图反映在依赖注入中。意识到这个限制可有助于为共享组件找到合适的位置。...你可以深入到代码中来查看我们如何使用 Dagger 解决 Plaid 中的依赖注入问题。
不久前在群里看到某小伙伴提出一个问题:“应后端要求需要在GET请求加入Body但Retrofit 中GET 请求添加Body会报错,如何解决?”...迪米特法则和门面模式 迪米特法则:也称之为最小知道原则,即模块之间尽量减少不必要的依赖,即降低模块间的耦合性。...,具体如何获取他不需要关心。...至于如何解析、构造、发起请求 Retrofit内部会做处理,调用者不想也不需要知道, 所以Retrofit通过门面模式帮调用者屏蔽了一些无用信息,只暴露出唯一入口,让调用者更专注于业务开发。...把关注点切到返回值,返回的Call对象没做任何操作,而是传入到adapter()方法一并返回来,字面意思应该是一个适配操作,那究竟如何适配?
1.external-base:这个大模块里面目前还没有添加小模块,但是未来应该会添加进去,这里面装着的是外部侵入的代码的封装,比如 bugly 除了需要添加库的依赖还需要为其加一些另外的代码,又比如一些...这一节我就来讲讲如何基于这两个库来定制一个大项目的网络请求层。中间会穿插着一些原理的讲解。 1.网络层请求流程 ?...如图2,我们一般也是在创建 Retrofit 的时候添加一些 Converter 以供这里使用。...这时我们可以再看看图2,可以看见其中有几处我绿色的框,这几个地方就是我们可以添加定制代码的地方。接下来我就会按顺序讲解一下这几处的定制代码是如何实现的。 ?...1.我们看图8的21行,这里给 Retrofit 添加了一个 OkhttpClient。之后的请求都是通过它来发送的。
本篇文章将介绍笔者在项目中对Retrofit的封装。 先来看一下封装过后的Retrofit如何使用。...Retrofit将请求到json数据直接转换成了实体类,但有时候我们需要查看json数据,Retrofit并没有提供直接获取json数据的功能。...因此我们需要自定义一个日志拦截器拦截json数据,并输入到控制台。 设置Http请求头。给OkHttp 添加请求头拦截器,配置请求头信息。还可以为接口统一添加请求头数据。...前面几节内容讲解了如何RxJava进行二次封装,封装部分的代码可以放在我们项目的Library模块中。...那么封装好之后我们应该如何在app模块中使用呢?
对于 JSON ,通常使用Gson ,但是可以添加自定义转换器来处理 XML 或其他协议。Retrofit 对 HTTP 请求使用 OkHttp 库。...Android and Java 好了介绍结束,想必大家的大刀都饥渴难耐了,那么我们直接开始吧 本文流程 依赖注入 so Easy 不用说了吧 在 app module 下的 build.gradle 中添加以下依赖...FIWKeepApp 的登录模块举例 在 Retrofit 出现之前,原始社会的我们一般是这样进行网络请求的: public void login2() { OkHttpClient...那么 Retrofit 救世主就出现了 Retrofit 实现 还是我项目中的登录模块,我将其改为 Retrofit 的形式 同样完成上面的功能,如果用 Retrofit 实现只需要: // baseUrl...登录功能实战 到这里想必大家都已经学会了 Retrofit 的使用 那么现在我就拿登录功能举例,看看如何在项目中引用 Retrofit 实战部分先置条件是 MVP + ButterKnife,大家很容易在网上找到资料
调用client.dispatcher.excute()进入到dispatcher类中,向runningSyncCalls队列中添加当前这个请求。...一个recalconnection就是一次链接 ConnectionPool 链接池,管理http1/http2的连接,同一个address共享一个connection,实现链接的复用。...okhttp断点续传用什么保存,怎么实现断点续传流程 Retrofit分析 涉及到的设计模式 外观模式,构建者模式,工厂模式,代理模式,适配器模式,策略模式,观察者模式 概括 Retrofit就是一个网络请求框架的封装...的七步骤 添加Retrofit依赖,网络权限 定义接收服务器返回数据的Bean 创建网络请求的接口,使用注解(动态代理,核心) builder模式创建Retrofit实例,converter,calladapter...创建接口实例,调用具体的网络请求 call同步/异步网络请求 处理服务器返回的数据 Retrofit网络通信八步骤 创建Retrofit实例 定义网络请求接口,并为接口中的方法添加注解 通过动态代理生成网络请求对象
领取专属 10元无门槛券
手把手带您无忧上云