试用kotlin multiplatform

news2025/1/8 4:28:38

目录

多平台框架简介

示例工程建立与运行

常用库

桌面平台遇到的一些问题

使用总结


多平台框架简介

多平台的框架不少,flutter,rust,每一个都是优点明显,缺点也明显.

flutter的桌面端控件少,质量不一.dart语言丑陋又慢.我不喜欢它.

rust,桌面gui不成熟,成熟一些的slint还是授权和qt一样,同一个团队部分成员做的.移动端更不用说了.难有大企业在支持

tarui,主要是桌面,可是也基于webview,试用了一下体验不好.

lua,支持多端,koreader是比较有名的,剩下估计用的不是太多,移动端的体验我觉得一般.本身也没有一个团队去推动多平台这事.

electron,移动端没有,桌面端主要受限于性能与进程,系统方面,体积也不小,用的人是有,也占不上主流.

windows端,gui成熟,多平台,暂时没发现有大的app在用c#,只是我没有发现.游戏开发用c#倒有不少人.

qt,授权是一个问题,相对较老了,算有商业团队支持.

kotlin的compose.自从jb出了这个以后,开始是吹的挺火的,但现在官方文档已经很少提桌面端了,只有移动端的示例,桌面的jni或调用native的库示例都没发现一个.ide的支持有时还不能识别出项目运行项.创建工程时,也没有桌面选项,猜想是想弱化吗,集中办移动端.

但本着对compose还有些了解与使用,试用一下.看看效果,现在移动端主要语言多数企业都是kt居多了.但compose用的多不多这个不了解,可能还不如flutter多.

示例工程建立与运行

从jb网站上下载了一个工程,对它的ide没办法建,但官网倒是有一个建工程的网站.Create your Kotlin Multiplatform app | Kotlin Multiplatform Development Documentation

然后composeApp目录下存着几个平台的代码,如果有选了ios,则在同级别的目录有一个iosApp,就这个工程模板都改了几次了,现在桌面的叫desktopMain,以前叫jvmMain.

我选了shared,就是主要共享代码,包括ui也使用一套,那么commonMain目录下主要存储着共享的部分.

androidMain/iosMain/desktopMain下面存着不同平台的入口.

对于每一个平台的依赖都是自己弄的.这也好.

如果用idea,安装一个compose multiplatform插件,as也装,但as无法正确运行桌面app,只有新建配置项,里面run里面gradle命令写上:desktopRun -DmainClass=com.archko.reader.kreader.MainKt --quiet 

其中MainKt就是指向你自己的入口名.

下面的工程选中composeApp就可以跑起来了.idea在Main.kt文件打开,有一个run标志也可以跑,或者顶部运行栏的.current file点击run就可以运行起来了.

图片就不发了

常用库

Kotlin Multiplatform samples | Kotlin Multiplatform Development Documentation

官方示例的文档,里面列出示例.

多平台,共享代码,决定了原来android平台上的一些java代码,库是无法使用的.所以几乎都要重写一套,网络,数据库,等等太多了,这不是一个人可以完成的,工作量也非常大.

  • kotlinx-serialization

  • kotlinx-datetime

  • kotlinx-coroutines

  • play-services-maps

  • play-services-locations

  • android-maps-compose

  • accompanist-permissions

  • decompose

  • koin

  • jsonpathkt-kotlinx

  • horologist

  • google-cloud

  • firebase

  • bare-graphql

  • apollo

  • accompanist

  • ktor

  • koin

  • exposed

  • postgresql

  • sqldelight

  • awssdk

  • ktor-client

  • molecule

  • decompose

  • horologist

这些库是几个示例中用到的,通常已经覆盖了一个多平台app的主要方面了.网络,数据库,序列化,时间,等等.但对一个现有的app,这些当然还远不够,自己公司的依赖还有一堆.第三方的也有不少.要么写一套多平台的依赖库,共享部分工作量就少,要么就是共享部分的代码放到不同的平台去实现.

桌面平台遇到的一些问题

比如我熟悉的,pdf阅读器,android平台就有系统的,mupdf这些实现.而其它平台只能找jvm上能跑的,或是js可运行的.

kotlin compose在桌面平台上是依赖skiako,就是skia基于kotlin的封装实现,这是一个成熟的图形库了,依赖要下载一个包,解压后达到1个gb多点.

理论上,在mac,linux上都是基于jvm跑的.依赖java代码也能跑.

移动平台当然差别就大了.ios需要编译为native,这个差异大多了.很难在上面可以编译进java代码进去.

第三方库,同时实现不同平台的库,目前没有关注到,比起flutter肯定是要少的多.flutter控件质量虽然有好有坏,总体还算能用.

由于没有找到桌面端如何加载dll,dylib这些库的示例,放弃了,就当作当前无法调用.所以只能用一个演示用的demo.

资源不是R.,而是Res.资源,bitmap也是对应imagebitmap,这对于android开发人员来说,很容易熟悉,本来就是java那套.ios开发人员估计也不会去用这个.

其它ui部分,主要还是compose的,布局,状态这些,如果熟悉compose移动端开发,多数代码是直接使用的.

使用总结

对于android开发人员,尤其熟悉compose的较友好.迁移工作量小

对于ios开发人员没什么吸引力.

完整的app依赖库方面,太少.需要自己实现,缓存,工具多数是要自己实现的.

比flutter在多平台方面要写的代码要多一些,kotlin语言我觉得是远胜dart的.

基于m3的设计,主要是compose这套ui的功劳.

移动优先的策略估计还会持续下去,对多端统一代码的需求,大企业未必多,更多是小企业节省人力的退而求其次选择.玩玩就可以,做一些不复杂,没有特别api的应用倒是可以,一方面美观(相对swing)来说,另一方面省力.毕竟新设计的库很多之前的缺点都考虑到了.这点flutter也可以做到.

官方文档目前主要是英文.变化还挺快.大公司app跟进的好像不多.

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

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

相关文章

解密人工智能:如何改变我们的工作与生活

引言:AI崛起背后的思考 在过去的几十年里,人工智能(AI)从科幻小说中的神秘存在,逐渐走进了我们的日常生活。无论是智能手机的语音助手,还是推荐心仪商品的电商平台,AI技术已悄然融入工作与生活的…

LLM - 使用 LLaMA-Factory 部署大模型 HTTP 多模态服务 教程 (4)

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/144881432 大模型的 HTTP 服务,通过网络接口,提供 AI 模型功能的服务,允许通过发送 HTTP 请求,交互大模型,通常基于云计算架构,无需在本地部署复杂的模型和硬件,…

Chapter 1 Understanding Large Language Models

文章目录 Understanding Large Language ModelsWhat is an LLM?Applications of LLMSStages of building and using LLMsUsing LLMS for different tasksA closer look at the GPT architectureBuilding a large language modelSummary Understanding Large Language Models …

游戏社交趋势下,游戏语音再升级!

如今,游戏已成为我们社交生活的一个重要娱乐方式,春节临近,与亲朋好友一起畅玩“开黑”无疑是节假日的一大乐趣。在游戏社交互动中,“游戏语音”不可或缺。在传统游戏语音领域,多人在线游戏如 MOBA、FPS 和 MMORPG 的实…

CTFshow—远程命令执行

29-35 Web29 代码利用正则匹配过滤了flag,后面加了/i所以不区分大小写。 可以利用通配符绕过 匹配任何字符串/文本,包括空字符串;*代表任意字符(0个或多个) ls file * ? 匹配任何一个字符(不…

Elasticsearch 入门教程

掌握Elasticsearch:从入门到入门 一、ES 背景1.1 ElasticSearch 的背景1.2 ElasticSearch 的应用场景 二、ES 简介2.1 ElasticSearch 简介2.2 ElasticSearch 的定义与特点2.3 ElasticSearch 与传统数据库的区别2.4 ElasticSearch 的优势和劣势 三、ES 的核心概念3.1…

【Vue学习】Vue 组件实例的生命周期(四个阶段,八个钩子)

一、为什么要理解生命周期? 理解生命周期就像是知道了一部电影的剧情走向,能让你在适当的时机做出反应。Vue 生命周期的钩子让你可以在不同的阶段插入你的逻辑,像是提前准备、后期清理或者在数据更新时做点事情。这种“精确控制”的能力会让你…

【Vim Masterclass 笔记08】第 6 章:Vim 中的文本变换及替换操作 + S06L20:文本的插入、变更、替换,以及合并操作

文章目录 Section 6:Transforming and Substituting TextS06L21 Inserting, Changing, Replacing, and Joining1 定位到行首非空字符,并启用插入模式2 在紧挨光标的下一个字符位置启动插入模式3 定位到一行末尾,并启用插入模式4 定位到光标的…

vip与haproxy构建nginx高可用集群传递客户端真实ip

问题 系统使用了vip与haproxy实现高可用以及对nginx进行负载均衡,但是发现在上游的应用服务无法拿到客户端的请求ip地址,拿到的是主haproxy机器的ip,以下是nginx与haproxy的缩减配置: location ~* ^/(xx|xx) {proxy_pass http:/…

YOLOv5部署到web端(flask+js简单易懂)

文章目录 前言最终实现效果图后端实现 主界面检测函数检测结果显示 前端实现 主界面(index.html)显示图片界面 总结 前言 最近,老板让写一个程序把yolov5检测模型部署到web端,在网页直接进行目标检测。经过1个星期的努力,终于实…

【Vue】分享一个快速入门的前端框架以及如何搭建

先上效果图: 登录 菜单: 下载地址: 链接:https://pan.baidu.com/s/1m-ZlBARWU6_2n8jZil_RAQ 提取码:ui20 … 主要是可以自定义设置token,更改后端请求地址较为方便。 应用设置: 登录与token设置: 在这里设置不用登录,可以请求的接口: request.js i…

【Linux】RPMSG通讯协议介绍

RPMSG协议通讯协议介绍 RPMSG,全称Remote processor Messaging。是一种核间通讯协议。在Linux Kernel中,已经内置了RPMSG。 Linux RPMSG基于共享内存,利用RPMSG可以高效的实现核间通信。比如Linux与FreeRTOS、Linux与Android,都可…

【51单片机-零基础chapter1】

安装软件(配套的有,不多赘述) 1.管理员身份运行keil和破解软件kegen 将CID代码复制粘贴到 一定要管理员方式,不然会error 插入板子 我的电脑,管理 1.如果是拯救者,查看端口,如果没有则显示隐藏 2.苹果不知道,好像不可以 3.其他电脑在"其他设备找" (注:本人在校已…

计算机网络-数据链路层(CSMA/CD协议,CSMA/CA协议)

2.2 ppp协议 点对点协议ppp是目前使用最广泛的点对点数据链路层协议。 2.3 媒体接入控制基本概念 共享信道要着重考虑的一个问题就是如何协调多个发送和接收站点对一个共享传输媒体的占用,即媒体接入控制MAC。 2.3.1 静态划分信道 频分复用 时分复用 波分复用 码分复…

JMeter + Grafana +InfluxDB性能监控 (二)

您可以通过JMeter、Grafana 和 InfluxDB来搭建一个炫酷的基于JMeter测试数据的性能测试监控平台。 下面,笔者详细介绍具体的搭建过程。 安装并配置InfluxDB 您可以从清华大学开源软件镜像站等获得InfluxDB的RPM包,这里笔者下载的是influxdb-1.8.0.x86_…

李宏毅机器学习笔记-Transformer

目录 1. Seq2seq 2. encoder Transformer 中的 Block 结构 3. Decoder 4.Encoder和Decoder间的信息传递 5.Training 6.Tips 1. Seq2seq Transformer 是一个seq2seq的model。Seq2seq指的是input是一个序列,输出也是一个序列,输出的长度是由机器自己…

【AWS SDK PHP】This operation requests `sigv4a` auth schemes 问题处理

使用AWS SDK碰到的错误,其实很简单,要装个扩展库 保持如下 Fatal error: Uncaught Aws\Auth\Exception\UnresolvedAuthSchemeException: This operation requests sigv4a auth schemes, but the client currently supports sigv4, none, bearer, sigv4-…

Qt 5.14.2 学习记录 —— 일 新项目

文章目录 1、创建2、查看代码 ---- main.cpp3、查看代码 ---- widgt.h4、查看代码 ---- widgt.cpp和widget.ui5、查看代码 ---- Empty.pro6、运行产生的中间文件 1、创建 左上角的文件,新建文件或项目。如果要写一个GUI程序,应当选择Application&#x…

Spring MVC和servlet

1.Spring MVC是Spring框架的一个扩展 2.Spring MVC工作流程 1、用户发送请求至前端控制器DispatcherServlet。 2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。 3、处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及…

蓝牙架构介绍

架构1:hostcontroller双芯片标准架构 这个标准把蓝牙协议栈分成host和controller两部分,其中host跑在AP上,controller跑在蓝牙模块上,两者之间通过HCI协议进行通信,AP芯片厂商一般会直接采用开源的Bluez来实现Host功能…