当前位置: 首页 > news >正文

Kotlin真·全平台——Kotlin Compose Multiplatform Mobile(kotlin跨平台方案、KMP、KMM)

前言

        随着kotlin代码跨平台方案的推出,kotlin跨平台一度引起不少波澜。但波澜终归没有掀起太大的风浪,作为一个敏捷型开发的公司,依然少不了Android和iOS的同步开发,实际成本和效益并没有太多变化。所以对于大多数公司来说依然风平浪静……

        时过境迁,如今kotlin已经支持Android、iOS、Web、PC的桌面UI开发了,并且iOS已经进入Beat的里程碑,kotlin即将迎来一统天下的时刻——一人一语言码完所有端。

上手一试

        kotlin作为Android官方语言并且完全支持Android Studio,所以KMM对Android来说完全0门槛,不需要任何学习就可以上手,并且完全能自主解决各种问题。

1.首先下载官方demo(也有对应插件,但不建议使用):Kotlin Multiplatform Wizard | JetBrains(防失效方式:Create your multiplatform project | Kotlin Multiplatform Development Documentation (jetbrains.com)>点击“Open the Kotlin Multiplatform wizard”即可)。Android、iOS、Web、PC、Server都可以选,这里建议全选,然后下载。

2.此处默认你已经会了Android Studio,我们解压后不要急着打开(打开巨慢,下载还总是超时)

将gradle/wrapper/gradle-wrapper.properties文件修改为tx镜像:

distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.4-bin.zip

将settings.gradle.kts文件的repositories(2个地方)都修改成如下:

    repositories {maven("https://maven.aliyun.com/repository/central")maven { setUrl("https://maven.aliyun.com/repository/public") }maven { setUrl("https://maven.aliyun.com/repository/google") }maven { setUrl("https://jitpack.io") }google {mavenContent {includeGroupAndSubgroups("androidx")includeGroupAndSubgroups("com.android")includeGroupAndSubgroups("com.google")}}mavenCentral()gradlePluginPortal()maven { setUrl("https://repo1.maven.org/maven2/") }maven("https://maven.pkg.jetbrains.space/public/p/compose/dev")}

然后使用Android Studio打开,按上述改法预计10分钟左右就构建完成了,当然如果报错请自行解决(和Android基本一致)

跑起来

Server

运行java服务端算是最简单的一个了,等到构建成功找到“server>src>main>kotlin>包名>Application”然后对着main函数点击run就行了(如果第一次出现找不到main的错误,再次run就行了)。然后根据日志提示使用任意浏览器打开链接如“127.0.0.1:8080”,即可看到返回信息。

Android

由于Android本身就支持kotlin并且框架也是jetpack,所以跑到Android设备上也是非常轻松的,选择composeApp(应该是默认项,下方截图)后直接右侧的run三角形就行了(如图),如果有错误,直接搜索Android相关的问题,基本上没有什么坑,这里不再多说

PC(Windows、Mac、Linux)

pc完全基于jvm的,运行到pc端应该也不会有什么难点,你只需要配置好java的环境变量就行了,运行方式:右侧边栏Gradle>composeApp>Tasks>compose Desktop>run。当然运行时需要安装到电脑上,根据各系统的安装提示就行了。

Web

运行到网页端第一次可能需要科学一下,因为kotlin用到了nodejs的功能,而nodejs一般是访问不了的(不开科学会出现长时间等待好几分钟后才会提示超时)。当然你还需要一个较新版的谷歌(119以上)、edge(119)或者火狐(121)浏览器。如果你都已经准备好了,那运行到网页端也应该不是问题,依然是右侧边栏Gradle>composeApp>Tasks>kotlin browser>wasmJsBrowserRun。

iOS

要想运行到iOS手机上,要求就相对高很多了:

1.一台较新的Mac电脑(博主用的m1,再低可能会出现跑不起来也没任何提示)

2.安装好xcode(建议App Store下载,不然安装位置不对也可能导致跑不起来也没任何提示)

3.配置完整的java环境,完整的!完整的!完整的!

        由于博主省懒,之前配置了Android Studio自带阉割版的java环境变量,导致跑不起来也没任何提示,你可以去官网下载JDK或者简单一点“Android Studio>设置>Gradle……>Gradle Tools>Grade>Gradle JDK>Download JDK”,然后记住下载的目录配置到环境变量上即可。

4.添加模拟器或者使用真机

5.Android Studio内安装插件“Kotlin Multiplatform”(设置>Plugins>Marketplace>搜索Kotlin Multiplatform),重启AS

6.添加iOS设备,选择Edit Config>点击加号>选择iOS Application>选择xcode路径(应该都会自动出来),框选里的都要填完(一般自动填的),填完后点击确定后点击右侧的run三角形即可运行到iOS上

[Mac不在,暂无运行截图]

运行提醒:多个端只能同时运行一个,运行前请先停止其他端的task

现状

作为横跨所有端并且语法统一的kmm,它的优点自然很多,不需要过多赘述,当然到目前为止依然有不少问题有待解决:

1.ktor server框架目前还算比较年轻,自身尚有很多优化空间。

2.jetpack虽然谷歌一直在推,但是由于这是属于革命性架构变更,目前占有率估计连20%都没有。

3.Web端必须要求浏览器支持wasm并且支持GC功能,目前谷歌和火狐也是去年才支持的,Safari到现在仍旧在开发中,其他小众浏览器更不用提支持了。

4.iOS手机目前还没发布release,并且只支持iOS15(iPhone13)以上,更早的版本暂不支持。

5.各端权限相关问题,对于权限、文件、图片各端需要单独自行处理,这算是所有跨平台方案的通病,属于无解型。

6.对于鸿蒙系统,目前还没有支持的意愿,这一块几乎空白。

7.作为开发者当然最重要的还是岗位了,目前看下来这种岗位几乎为0。

当前应用方向

虽然kmm的问题不少,有些甚至比较致命,但就目前来说仍可以在某些方面有一席之地,并且后期潜力巨大,完全可以当做初期铺垫。

1.对于偏应用的初创项目kmm的Android、iOS还是比较方便和快速

2.对于小型服务端,ktor也是有不少优点,并且也能在app端人员中快速上手

3.对于内部网页系统,那如果app端人员也会写那何乐而不为呢

4.当然没有ui的Multiplatform早已经正式发版并跨所有端了,如果先共享逻辑后期再考虑共享ui不失为一种比较友好的解决方案(不少大厂已经开始尝试了)

转载请注明出处:王能的博客Kotlin真·全平台——Kotlin Compose Multiplatform Mobile(kotlin跨平台方案、KMP、KMM)-CSDN博客

后续:

1.如何打包发布

2.如何修改分类源集(Android、iOS为一类,Web、PC为一类)

相关文章:

Kotlin真·全平台——Kotlin Compose Multiplatform Mobile(kotlin跨平台方案、KMP、KMM)

前言 随着kotlin代码跨平台方案的推出,kotlin跨平台一度引起不少波澜。但波澜终归没有掀起太大的风浪,作为一个敏捷型开发的公司,依然少不了Android和iOS的同步开发,实际成本和效益并没有太多变化。所以对于大多数公司来说依然风平…...

unity 默认渲染管线材质球的材质通道,材质球的材质通道

标准渲染管线——材质球的材质通道 文档,与内容无关,是介绍材质球的属性的。 https://docs.unity3d.com/2022.1/Documentation/Manual/StandardShaderMaterialParameters.html游戏资源中常见的贴图类型 https://zhuanlan.zhihu.com/p/260973533 十大贴图…...

PostgreSQL升级:使用pg_upgrade进行大版本(16.3)升级(17.0)

1.pg_upgrade工具介绍 pg_upgrade 会创建新的系统表,并以重用旧的数据文件的方式进行升级。 pg_upgrade 的参数选项如下: -b bindir,--old-bindirbindir:旧的 PostgreSQL 可执行文件目录; -B bindir,--new-…...

userdel命令:删除指定Linux用户

一、命令简介 ​userdel​ 命令用于删除 Linux 系统中的用户账号。当您不再需要某个用户账号时,可以使用 userdel​ 命令将其从系统中删除。 ‍ 二、命令参数 userdel [选项] 用户名一些常用的选项包括: -r, --remove: 删除用户的家目录及邮件目录。…...

QT系统学习篇(1)

一、什么是Qt、Qt的优势 QT是一个跨平台的C图形用户界面库,目前包括Qt Creator、Qt Designer等等快速开发工具。支持所有Linux/Unix系统,还支持windows平台。Qt很容易扩展,并且允许真正的组件编程。(军工企业项目开发基本离不开Q…...

每日一刷——9.26——ACM训练题——Fibonacci Again

题目描述&#xff1a; There are another kind of Fibonacci numbers: F(0) 7, F(1) 11, F(n) F(n-1) F(n-2) (n>2). Input Input consists of a sequence of lines, each containing an integer n. (n < 1,000,000). Output Print the word "yes" if 3 d…...

代码随想录 | Day28 | 回溯算法:组合组合总和III

代码随想录 | Day28 | 回溯算法&#xff1a;组合&&组合总和III 关于这个章节&#xff0c;大家最好是对递归函数的理解要比较到位&#xff0c;听着b站视频课可能呢才舒服点&#xff0c;可以先去搜一搜关于递归函数的讲解&#xff0c;理解&#xff0c;再开始这个章节会比…...

【重学 MySQL】四十五、数据库的创建、修改与删除

【重学 MySQL】四十五、数据库的创建、修改与删除 一条数据存储的过程数据输入数据验证数据处理数据存储数据持久化反馈与日志注意事项 标识符命名规则基本规则长度限制保留字与特殊字符命名建议示例 MySQL 中的数据类型创建数据库创建数据库时指定字符集和排序规则 查看数据库…...

STM32驱动直流电机

stm32通过PWM控制直流电机的方向和速度。 小直流电机需要几百毫安的电流&#xff0c;单片机只能提供几毫安的电流。电机内线圈转动时切割磁感线以及电机内转子线圈的电感效应都会产生反电动势&#xff0c;损坏芯片。 电机驱动芯片能够作为STM32驱动电机的帮手。 SLEEP暂停工作…...

【C++】二叉搜索树+变身 = AVL树

&#x1f680;个人主页&#xff1a;小羊 &#x1f680;所属专栏&#xff1a;C 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 前言一、AVL树二、AVL树的实现2.1 平衡因子2.2 旋转处理2.2.1 左单旋&#xff1a;插入新节点后单纯的右边高2.2.2 …...

Flutter String 按 ,。分割

在 Flutter 中&#xff0c;如果你想将一个字符串按特定的字符&#xff08;例如中文逗号 &#xff0c; 和英文句号 .&#xff09;进行分割&#xff0c;可以使用 Dart 语言的字符串处理功能。具体来说&#xff0c;你可以使用 split 方法&#xff0c;并传入一个正则表达式来匹配这…...

Redis: 集群高可用之MOVED转向和ASK转向解决方案

MOVED转向 1 ) 问题描述 在客户端操作Redis集群的时候 MOVED转向 或 MOVED错误是经常遇到的一类问题我们先连入集群&#xff1a;$ /usr/local/redis/bin/redis-cli -a 123456 -h 192.168.10.101 -p 6371之前在Redis中存储过一些数据&#xff0c;比如下面的情况&#xff0c;当输…...

idea插件市场安装没反应

https://plugins.jetbrains.com/idea重启后还是不行那就...

数据结构之排序(5)

摘要&#xff1a;本文主要讲各种排序算法&#xff0c;注意它们的时间复杂度 概念 将各元素按关键字递增或递减排序顺序重新排列 评价指标 稳定性: 关键字相同的元素经过排序后相对顺序是否会改变 时间复杂度、空间复杂度 分类 内部排序——数据都在内存中 外部排序——…...

R包的安装、加载以及如何查看帮助文档

0x01 如何安装R包 一、通过R 内置函数安装&#xff08;常用&#xff09; 1.安装CRAN的R包 install.packages()是一个用于安装 R 包的重要函数。 语法&#xff1a;install.packages(pkgs, repos getOption("repos"),...) 其中&#xff1a; pkgs&#xff1a;要安…...

【YOLO学习】YOLOv3详解

文章目录 1. 网络结构1.1 结构介绍1.2 改进 2. 训练与测试过程3. 总结 1. 网络结构 1.1 结构介绍 1. 与 YOLOv2 不同的是&#xff0c;YOLOv3 在 Darknet-19 里加入了 ResNet 残差连接&#xff0c;改进之后的模型叫 Darknet-53。在 ImageNet上 实验发现 Darknet-53 相对于 ResN…...

JDK1.0主要特性

JDK 1.0&#xff0c;也被称为Java 1&#xff0c;是Java编程语言的第一个正式版本&#xff0c;由Sun Microsystems公司在1996年发布。JDK 1.0的发布标志着Java作为一种编程语言和平台的正式诞生&#xff0c;它带来了许多创新的概念和特性&#xff0c;对后来的软件开发产生了深远…...

CSS基础-盒子模型(三)

9、CSS盒子模型 9.1 CSS常用长度单位 1、px&#xff1a;像素&#xff1b; 2、em&#xff1a;相对元素font-size的倍数&#xff1b; 3、rem&#xff1a;相对根字体的大小&#xff0c;html标签即是根&#xff1b; 4、%&#xff1a;相对于父元素进行计算。 注意&#xff1a;CSS样…...

深度学习中的损失函数详解

深度学习中的损失函数详解 文章目录 深度学习中的损失函数详解损失函数的基础概念常见的损失函数类型及应用场景回归问题的损失函数分类问题的损失函数自定义损失函数 如何选择合适的损失函数&#xff1f;损失函数在深度学习中的应用 在深度学习的世界中&#xff0c;损失函数&a…...

系统架构设计师-下午案例题(2022年下半年)

1.试题-(共25分):阅读以下关于软件架构设计与评估的叙述在答题纸上回答问题1和问题2。 【说明】某电子商务公司拟升级其会员与促销管理系统&#xff0c;向用户提供个性化服务&#xff0c;提高用户的粘性。在项目立项之初&#xff0c;公司领导层一致认为本次升级的主要目标是提…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...