KMP基础架构

前言

Kotlin可以用来开发全栈, 我们所熟悉的各个端几乎都支持(除了鸿蒙)

而我们要开发好KMP项目需要一个好的基础架构,这样不仅代码更清晰,而且能共享更多的代码

正文

我们可以先将KMP分为前端和服务端

它们两端也能共享一些代码,比如接口声明,bean类,基础工具类等

前端和服务端共享

基础工具类

首先是基础工具类,module可以命名为stdUtil

这些工具类应该是可以仅使用Kotlin基础库的一些工具代码

比如空判断,协程,集合,字符串类的工具等

接口声明和类

这些可以放到一块,module可以命名为shared

其中可以放一些前后端通用的bean类,比如接口序列化返回的bean

还可以放接口的声明,这样前后端都实现这个接口

shared中声明:

声明中限制了接口的url,参数和返回值

后端实现:

(使用的spring,也可以用ktor)

可以看到后端直接实现了这个接口并重写了这个函数,url,参数和返回值直接就确定了,后续如果有变更后端就可以直接知道(不修改会编译不过去)

前端实现:

该代码也是实现了其接口,然后通过下面这个开源库用ksp自动生成的,这样前端可以什么都不写就有了此接口的声明,并且调用返回值Call的相应执行函数可以通过网络请求获取到后端的响应

开源库:LazyPeopleHttp: Kotlin跨平台的网络请求客户端, 比Retrofit更容易声明

前端共享

前端目前可以分为几个前端,对应的module可以命名为:

androidApp

iosApp

desktopApp

webApp

前端共享的module可以叫 frontEndShared

几个前端同时依赖 frontEndShared, shared, stdUtil

后端(backend)依赖 shared, stdUtil

前端ui和逻辑共享

页面

首先ui共享一般可以使用页面,比如Activity,这里可以参考这篇文章(ui当然就Compose了)

Compose之跨平台Activity页面-CSDN博客

这篇文章使用了页面对应平台的页面,也可以使用文章里desktop页面的方式,自己去管理页面展示,打开和关闭等(比较推荐,可以少很多平台的坑,且代码更通用)

ps:如果需要将页面按照desktop的方式完全自己管理,需要通过class构造出相应的类,而KMP中并没有反射,这时需要使用这个库:VirtualReflection: 解决kotlin跨平台没有反射的问题

键值对存储

不同平台可以桥到不同平台的键值对存储上,比如安卓的sp,但desktop上没有好用的键值对存储,可以使用这个库:SharedPreferencesOfDesktop: 在Windows, Linux, MacOs中方便的存取配置文件

数据库

数据库可以使用这个:ctripcorp/SQLlin: A DSL SQLite library for Kotlin Multiplatform. (github.com)

网络请求

网络请求推荐使用这个,可以更好的共享代码(就如上面的前后端代码共享那样)

Kotlin跨平台的网络请求框架-跨平台的Retrofit_android kotlin 网络框架_李小白lt的博客-CSDN博客

序列化

序列化应该没得选,只能用这个,性能好,但使用稍复杂,支持json,Protobuf等多种结构

Kotlin/kotlinx.serialization: Kotlin multiplatform / multi-format serialization (github.com)

图片加载

qdsfdhvh/compose-imageloader: Compose Image library for Kotlin Multiplatform. (github.com)

目前可以用这个,据说coil3后会支持KMP

资源管理

可以参考这篇文章:KMP中的资源处理(字符串,图片等)-CSDN博客

BuildConfig

KMP中的BuildConfig_李小白lt的博客-CSDN博客

导航

没啥推荐的,多试试吧,找到一个适合自己的

其它

说实话KMP目前生态还很缺,很多东西没有一个好用的库,所以有能力可以补充下,后续如果我找到更好用的就随时修改文章

end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/187187.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go语言 值传递

官方说法,Go中只有值传递,没有引用传递 而Go语言中的一些让你觉得它是引用传递的原因,是因为Go语言有值类型和引用类型,但是它们都是值传递。 值类型 有int、float、bool、string、array、sturct等 引用类型有slice&#xff0c…

Logstash使用指南

介绍 Logstash是一个开源数据收集引擎,具有实时管道功能。它可以动态地将来自不同数据源的数据统一起来,并将数据标准化到你所选择的目的地。尽管Logstash的早期目标是搜集日志,现在它的功能已完全不只于此。任何事件类型都可以加入分析&…

docker (镜像分层、阿里云镜像推送/拉去)-day02

一、镜像概念 Docker 镜像是 Docker 容器的基础,它提供了一种可重复使用的、跨平台的部署方式,使得应用程序的部署和运行变得简单和高效。 把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),打包好…

C语言练习记录(蓝桥杯练习)(小蓝数点)

目录 小蓝数点 第一题程序的输出结果是?: 第二题下面代码的执行结果是什么?: 第三题下面代码的执行结果是什么?: 第四题关于关系操作符说法错误的是?: 第五题对于下面代码段,y的值为? 第六题sum 21 …

informer辅助笔记:exp/exp_informer.py

0 导入库 from data.data_loader import Dataset_ETT_hour, Dataset_ETT_minute, Dataset_Custom, Dataset_Pred from exp.exp_basic import Exp_Basic from models.model import Informer, InformerStackfrom utils.tools import EarlyStopping, adjust_learning_rate from u…

huggingface - pipeline - translate 记录

文章目录 #!/usr/bin/env python # -*- encoding: utf-8 -*-import os ,sys from transformers import pipelinemodel_checkpoint "Helsinki-NLP/opus-mt-zh-en" translator pipeline("translation", modelmodel_checkpoint)def translate_arr(arr): r…

Java 数据结构篇-用链表、数组实现栈

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 栈的说明 2.0 用链表来实现栈 2.1 实现栈 - 入栈方法(push) 2.2 实现栈 - 出栈(pop) 2.3 实现栈 - 查看栈顶元素…

mybatis 实现批量更新的三种方式

注&#xff1a;Mybatis实现批量更新有三种方式&#xff0c;分别是使用foreach标签、使用SQL的case when语句和使用动态SQL的choose语句。具体实现方法如下&#xff1a; 1&#xff1a;使用foreach标签 <update id"batchUpdate" parameterType"java.util.Lis…

C 标准库 <errno.h>与 <float.h>

C 标准库 <errno.h> C 标准库的 errno.h 头文件定义了整数变量 errno&#xff0c;它是通过系统调用设置的&#xff0c;在错误事件中的某些库函数表明了什么发生了错误。该宏扩展为类型为 int 的可更改的左值&#xff0c;因此它可以被一个程序读取和修改。 在程序启动时…

国产linux单用户模式破解无密码登陆 (麒麟系统用户登录密码遗忘解决办法)

笔者手里有一批国产linu系统&#xff0c;目前开始用在日常的工作生产环境中&#xff0c;我这个老程序猿勉为其难的充当运维的或网管的角色。 国产linux系统常见的为麒麟Linux&#xff0c;统信UOS等&#xff0c;基本都是基于debian再开发的linux。 问题描述&#xff1a; 因为…

基于AT89C51单片机的倒数计时器设计

1&#xff0e;设计任务 利用AT89C51单片机为核心控制元件,设计一个简易的数字电压表&#xff0c;设计的系统实用性强、操作简单&#xff0c;实现了智能化、数字化。 本设计采用单片机为主控芯片&#xff0c;结合周边电路组成LED彩灯的闪烁控制系统器&#xff0c;用来控制红色…

用于缓存一些固定名称的小组件

项目中&#xff0c;用于缓存姓名、地名、单位名称等一些较固定名称的id-name小组件。用于减少一些表的关连操作和冗余字段。优化代码结构。扩展也方便&#xff0c;写不同的枚举就行了。 具体用法&#xff1a; {NameCacheUser.USER.getName(userId);NameCacheUser.ACCOUNT.getN…

excel合并单元格教程

在表格里&#xff0c;总是会遇到一级表格、二级表格的区别&#xff0c;这时候一级表格会需要合并成一个大格子&#xff0c;那么excel如何合并单元格呢&#xff0c;其实使用快捷键或者功能键就可以了。 excel如何合并单元格&#xff1a; 1、首先我们用鼠标选中所有要合并的单元…

最大公约数的C语言实现xdoj31

时间限制: 1 S 内存限制: 1000 Kb 问题描述: 最大公约数&#xff08;GCD&#xff09;指某几个整数共有因子中最大的一个&#xff0c;最大公约数具有如下性质&#xff0c; gcd(a,0)a gcd(a,1)1 因此当两个数中有一个为0时&#xff0c;gcd是不为0的那个整数&#xff…

Redis编码类型及对应含义

对象类型编码类型(encoding)取值范围Stringintlong长度范围内的数字embstr长度小于40的value值。数字和字符。raw长度大于40的value值Listziplist所有元素长度小于64字节&#xff0c;并且列表元素的个数小于512个linkedlist不满足ziplist的数据Setintset纯数字&#xff0c;列表…

分治法之查找最大值

思路: 定义一个递归函数 findMax&#xff0c;它接受三个参数&#xff1a;数组 arr、起始位置 start 和结束位置 end。如果 start 等于 end&#xff0c;说明数组中只有一个元素&#xff0c;直接返回该元素的值作为最大值。否则&#xff0c;计算数组的中间位置 mid&#xff0c;可…

XXL-Job详解(一):组件架构

目录 XXL-Job特性系统组成架构图调度模块剖析任务 “运行模式” 剖析执行器 XXL-Job XXL-JOB是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线&#xff0c;开箱即用。 特性 1、简单&#…

java+springboot实验室管理系统的设计与实现ssm+jsp

课题研究内容&#xff1a; &#xff08;1&#xff09; 系统需求分析&#xff08;构成模块&#xff0c;系统流程&#xff0c;功能结构图&#xff0c;系统需求&#xff09; &#xff08;2&#xff09; 实验室课程安排功能模块&#xff08;课程的录入和调补&#xff09; &#xff…

prompt提示

用例生成 # 任务描述 作为一个高级c程序员&#xff0c;需要完成下列功能的gtest测试用例 # 功能描述 给定两个数字型字符串s1和s2,求和&#xff0c;返回值也是字符串 # 接口举例 调用strAdd("123", "132"),输出“255” # 输出要求 - 入参为空串、nu…

wyler水平仪维修WYLER倾角仪维修CH-8405

瑞士WYLER电子水平仪维修&#xff1b;BIueCLINO倾斜度测量仪维修&#xff1b;wyler电子倾角仪维修。 水平仪常见故障及处理方法 1、 仪表通电不工作。 A、检查仪表220V电源端子接线是否正确 B、检查仪表电容是否熔断&#xff1b; C、拧下仪表后的固定螺钉&#xff0c;将表…