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

【译】快速开始 Compose 跨平台项目

原文: Compose Multiplatform application

作者:JetBrains

注意

Compose Multiplatform 中的 iOS 部分目前处于 Alpha 状态。以后可能会有不兼容的更改,届时也许需要手动进行迁移。

你可以使用这个模板来开发同时支持桌面、安卓和 iOS 的跨平台应用。

跟着接下来的教程,你将学会如何启动并运行你的第一个 Compose 跨平台项目,最终结果将是一个使用 Kotlin 跨平台 编写逻辑代码 和 使用 Compose 跨平台作为 UI 框架的项目。

banner.png

配置环境

提醒

由于 Apple 公司的要求。
你需要一台安装了 macOS 系统的 Mac 电脑来编写并在模拟器或真机上运行 iOS 相关的代码。

为了让这个模板正常运行,你需要以下这些东西:

  • 一台安装了最新版本 macOS 系统的电脑
  • Xcode
  • Android Studio
  • Kotlin Multiplatform Mobile 插件
  • CocoaPods 依赖管理

检查环境

在开始之前,你需要先使用 KDoctor 工具确保你的开发环境已经搭建无误:

  1. 使用 Homebrew 安装 KDoctor:

    brew install kdoctor
    
  2. 在终端中运行 KDoctor :

    kdoctor
    

    如果所有环境都搭建无误的话,你会看到下面这样的输出内容:

    Environment diagnose (to see all details, use -v option):
    [✓] Operation System
    [✓] Java
    [✓] Android Studio
    [✓] Xcode
    [✓] CocoapodsConclusion:✓ Your system is ready for Kotlin Multiplatform Mobile development!
    

否则,KDoctor 将会以高亮显示目前仍然需要确认的环境配置,并且会给出一个修复建议。

检查项目结构

在 Android Studio 中打开项目,然后将视图从 Android 切换到 Project 就可以看到这个项目的所有文件和目标平台模块:

open_project_view.png

Compose Multiplatform 项目包括四个模块:

shared

这是一个 Kotlin 模块,包括了 桌面、Android 和 iOS 应用程序的通用逻辑代码,同时也是在各个平台中使用的共享代码。

shared 模块也是你编写 Compose 跨平台代码的地方。
shared/src/commonMain/kotlin/App.kt 文件中,你可以找到该项目程序的共享 @Composable 根函数。

该项目使用 Gradle 作为编译(builds)系统。你可以在 shared/build.gradle.kts 文件中添加依赖和更改设置。
shared 模块将会被编译为 Java 库(library),Android 库,以及 iOS 框架(framework)。

desktopApp

这是一个 kotlin 模块,它会被编译为桌面应用。它使用 Gradle 作为编译系统。 desktopApp 模块依赖并且将 shared 模块看作一个普通(regular)库来使用。

androidApp

这是一个 kotlin 模块,它会被编译为安卓应用。它使用 Gradle 作为编译系统。androidApp 模块依赖并且将 shared 模块看作一个普通安卓库来使用。

iosApp

这是一个 Xcode 项目,它会被编译成 iOS 程序。
它依赖并且将 shared 模块看作一个 CocoaPods 依赖来使用。

运行程序

桌面端

为了运行桌面端程序,你需要在 运行配置(run configurations)列表选择 desktopApp 然后点击 Run

run_on_desktop.png

desktop_app_running.png

你当然也可以在终端中执行 Gradle 任务:

  • ./gradlew run 用于运行程序
  • ./gradlew package 用于打包本地二进制程序至 build/compose/binaries

安卓端

为了在 Android 模拟器中运行程序,你需要:

  1. 确保你有一个可用的安卓虚拟机(模拟器),
    否则, 创建一个。
  2. 在运行配置(run configurations)列表中,选择 androidApp
  3. 选择你的虚拟设备(模拟器),然后点击 Run

run_on_android.png

android_app_running.png

或者,也可以使用 Gradle

要在安卓真机或者模拟器上安装安卓程序,你可以在终端中运行 ./gradlew installDebug

iOS 端

在模拟器上运行

要在 Android Studio 中启动 iOS 模拟器并运行程序,你需要修改 iosApp 的配置:

  1. 在运行配置(run configurations)列表中,选择 Edit Configurations

edit_run_config.png

  1. 转至 iOS Application | iosApp.

  2. Execution target 列表, 选择你的目标设备,点击 OK

target_device.png

  1. 现在 iosApp 的运行配置就已经可用了。 点击模拟器名称旁边的 Run

ios_app_running.png

在 iOS 真机上运行

你可以免费在你的 iOS 真机设备上运行你的 Compose 跨平台项目。为此,你需要以下这些东西:

  • 与您 Apple ID 关联的 TEAM_ID
  • 在 Xcode 中已注册的 iOS 设备

注意

在您继续之前,我们建议您先使用 Xcode 创建一个简单的 “Hello, world!” 项目并确保可以在您的设备中成功运行。

你可以按照以下说明操作或者观看 Stanford CS193P lecture recording 学习如何做。

如何在 Xcode 中创建一个简单的项目
  1. 在 Xcode 的欢迎页面,选择 Create a new project in Xcode
  2. iOS 页面中, 选择 App 模板。 然后点击 Next
  3. 填写产品名(product name)并保持其他设置为默认。然后点击 Next
  4. 选择将项目储存在哪儿后点击 Create。你将会看到一个在设备屏幕上展示 “Hello,
    world!” 的 app。
  5. 在 Xcode 屏幕的顶部,点击设备名字旁边的 Run 按钮。
  6. 将你的设备插入电脑。你将看到这个设备出现在运行选项列表中。
  7. 选择你的设备然后点击 Run
查找您的 Team ID

在终端中,运行 kdoctor --team-ids 可以查找您的 Team ID,
KDoctor 将会列出当前系统中配置的所有可用 Team ID,比如:

3ABC246XYZ (Max Sample)
ZABCW6SXYZ (SampleTech Inc.)
另一种查找 Team ID 的方式

如果 KDoctor 对于你来说不好使,试试另一种方法:

  1. 在 Android Studio 中, 使用选择的真机运行 iosApp ,此时应该会编译失败。
  2. 打开 Xcode 并选择 Open a project or file.
  3. 找到你项目的 iosApp/iosApp.xcworkspace 文件。
  4. 在左侧菜单中,选择 iosApp
  5. 找到 Signing & Capabilities
  6. Team 列表,选择你的 team。

如果你尚未设置 team,使用 Add account 选项并跟着下面的步骤做。

要运行程序,需要设置 TEAM_ID

  1. 在模板中,找到 iosApp/Configuration/Config.xcconfig 文件。
  2. 设置 TEAM_ID.
  3. 在 Android Studio 重新打开项目。此时 iosApp 的配置中应该会显示已注册的设备。

尝试你的第一次修改

现在我们来改一下代码,然后看看是不是 Android 和 iOS 程序都同时发生了改变:

  1. 在 Android Studio 中,找到 shared/src/commonMain/kotlin/App.kt 文件。
    这是 Compose 跨平台 app 的通用入口。

    在这里面,你可以看到负责渲染 “Hello, World!” 按钮和 Compose 跨平台的logo以及动画的代码:

    @OptIn(ExperimentalResourceApi::class)
    @Composable
    internal fun App() {MaterialTheme {var greetingText by remember { mutableStateOf("Hello, World!") }var showImage by remember { mutableStateOf(false) }Column(Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally) {Button(onClick = {greetingText = "Hello, ${getPlatformName()}"showImage = !showImage}) {Text(greetingText)}AnimatedVisibility(showImage) {Image(painterResource("compose-multiplatform.xml"),null)}}}
    }
    
  2. 接下来更新共享代码,在其中添加一个用于更新当前按钮文本的输入框:

    @OptIn(ExperimentalResourceApi::class)
    @Composable
    internal fun App() {MaterialTheme {var greetingText by remember { mutableStateOf("Hello, World!") }var showImage by remember { mutableStateOf(false) }Column(Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally) {Button(onClick = {greetingText = "Hello, ${getPlatformName()}"showImage = !showImage}) {Text(greetingText)}
    +           TextField(greetingText, onValueChange = { greetingText = it })AnimatedVisibility(showImage) {Image(painterResource("compose-multiplatform.xml"),null)}}}
    }
    
  3. 重新运行 desktopAppandroidAppiosApp 选项,你将看到变化已经同时反映到了三个 app 中:

text_field_added.png

如何配置 iOS 程序

要更好地理解此模板的设置并了解如何在不使用 Xcode 的情况下配置 iOS 应用程序的基本属性,你可以在 Android Studio 中打开 iosApp/Configuration/Config.xcconfig 文件。该配置文件包含:

  • APP_NAME, 目标可执行文件以及应用程序包名。
  • BUNDLE_ID 该程序在整个系统中的唯一标识.
  • TEAM_ID, Apple 生成并分配给您的团队的唯一标识.

要更改 APP_NAME 选项,请在使用 Android Studio 打开项目之前 在任意文本编辑器中打开 Config.xcconfig 文件,并将其更改为所需的名称。

如果需要在已经使用 Android Studio 中打开过的项目中更改这个选项,你需要按照以下步骤进行:

  1. 在 Android Studio 中关闭这个项目。
  2. 在终端中运行 ./cleanup.sh
  3. 更改你需要更改的配置参数。
  4. 使用 Android Studio 重新打开这个项目。

如果要配置其他高级参数,你需要使用 Xcode。 在使用 Android Studio 打开项目之后,在 Xcode 中打开 iosApp/iosApp.xcworkspace 然后在其中编辑配置即可。

下一步

我们鼓励你进一步探索 Compose 跨平台项目,并尝试更多项目:

  • Create an application targeting iOS and Android with Compose Multiplatform
  • Create an application targeting Windows, macOS, and Linux with Compose Multiplatform for Desktop
  • Complete more Compose Multiplatform tutorials
  • Explore some more advanced Compose Multiplatform example projects

相关文章:

【译】快速开始 Compose 跨平台项目

原文: Compose Multiplatform application 作者:JetBrains 注意 Compose Multiplatform 中的 iOS 部分目前处于 Alpha 状态。以后可能会有不兼容的更改,届时也许需要手动进行迁移。 你可以使用这个模板来开发同时支持桌面、安卓和 iOS 的跨平…...

高性能服务器之mysql数据库连接池设计与实现

高性能服务器之mysql数据库连接池设计与实现 链接:https://pan.baidu.com/s/1ISZ1Sy087GUeaekW3sV_oA?pwd0t9q 内存泄漏 链接:https://pan.baidu.com/s/1AWPnbuzVSpoP-CnEgJk5hg?pwdaieq 提取码:aieq 线程池 链接:https://pan…...

黑客技术(自学)——网络安全

前言 前几天发布了一篇 网络安全(黑客)自学 没想到收到了许多人的私信想要学习网安黑客技术!却不知道从哪里开始学起!怎么学?如何学? 今天给大家分享一下,很多人上来就说想学习黑客&#xff0c…...

day06-前后端项目上传到gitee、后端多方式登录接口、发送短信功能、发送短信封装、短信验证码接口、短信登录接口

1 前后端项目上传到gitee 2 后端多方式登录接口 2.1 序列化类 2.2 视图类 2.3 路由 3 发送短信功能 4 发送短信封装 4.0 目录结构 4.1 settings.py 4.2 sms.py 5 短信验证码接口 6 短信登录接口 6.1 视图类 6.2 序列化类 1 前后端项目上传到gitee # 我们看到好多开源项目…...

【SA8295P 源码分析 (一)】83 - SA8295P HQNX + Android 完整源代码下载方法介绍

【SA8295P 源码分析 一】83 - SA8295P HQNX + Android 完整源代码下载方法介绍 一、高通官网 Chipcode 下载步骤介绍1.1 高通Chipcode 下载步骤1.2 高通 ReleaseNote 下载方法二、高通 HQX 代码介绍2.1 完整的 HQX 代码结构:sa8295p-hqx-4-2-4-0_hlos_dev_qnx.tar.gz2.2 sa829…...

文献阅读快速法-ChatPDF

如题,直接提供给大家一款能够快速阅读文档的好工具——iTextMaster。 iTextMaster是一款免费的pdf阅读浏览器,上传pdf文档后等待几秒钟,AI就会自动反馈给用户关于文档的摘要总结。十分的方便且实用。 ChatPDF为您提供简洁的文档摘要。对于那…...

Jenkins 内存占用

查看内存占用 # ps aux | grep 9090 root 130854 0.0 0.0 8900 708 pts/1 S 16:23 0:00 grep --colorauto 9090 root 4010748 0.2 30.7 5826500 2502884 ? Ssl Oct13 8:55 /usr/bin/java -Djava.awt.headlesstrue -jar /usr/share/java/jenkins…...

1. vue-sy-admin: 基于vue3+TypeScript的全局过滤器(filters) 封装及示例

在vue3中使用全局filters已经不是必须,有很多种替代方案(直接定义函数即可)。如果项目中使用了unplugin-auto-import插件完全可以将filters导出函数使其在全局自动引入/声明。当然在这里就不说插件的使用了。下面就详细说说如何实现 题外话: 强烈推荐使用 vueuse&a…...

操作系统监控:守护您的计算机系统稳定运行的坚实防线

在数字化时代,计算机系统已成为各行业的关键支撑。为了保证系统的稳定运行,操作系统监控成为了不可或缺的技术手段。监控易运维管理软件,作为一款全面的监控解决方案,能够监控各类Windows、Linux、UNIX等操作系统,包括…...

PostgreSQL | CTE | 使用with子句的通用表达式

CTE(Common Table Expressions) 简单讲,CTE就是日常SQL中出现的with语句,其原理就是通过提前将数据查询出来后作为临时结果集使用,可以与SELECT \ INSERT \ UPDATE \ DELETE的SQL连用。 优点 可读性强 CTE 允许你将…...

A Close Look into the Calibration of Pre-trained Language Models

本文是LLM系列文章,针对《A Close Look into the Calibration of Pre-trained Language Models》的翻译。 预训练语言模型的校准研究 摘要1 引言2 背景3 评测指标4 PLM是否学会了校准?5 现有方法的效果如何?6 结论局限性与未来工作 摘要 预…...

【控制台】报错:Uncaught ReferenceError: process is not defined

文章目录 报错示例: 解决方法参考文献:https://github.com/vfile/vfile/issues/38...

Android自定义AppGlideModule,DataFetcher ,ModelLoaderFactory,ModelLoader,Kotlin(1)

Android自定义AppGlideModule,DataFetcher ,ModelLoaderFactory,ModelLoader,Kotlin(1) 假设实现一个简单的功能,对传入要加载的path路径增加一定的筛选、容错或“重定向”,需要自定义一个模型,基于这个模型,让Glide自动匹配模型…...

uni-app--》基于小程序开发的电商平台项目实战(五)

🏍️作者简介:大家好,我是亦世凡华、渴望知识储备自己的一名在校大学生 🛵个人主页:亦世凡华、 🛺系列专栏:uni-app 🚲座右铭:人生亦可燃烧,亦可腐败&#xf…...

新型的终端复用器 tmux

以前遇到长时间执行任务时,一般是使用nohup加后台运行,但是涉及到少量代码编写。 同事介绍了一个screen命令,根据文档,此命令已经过时,最新的命令是tmux。 tmux的介绍文档,RedHat的这一篇非常不错。 在文…...

标准化后端向前端传来的Json数据

后端响应固定格式给前端: 1,创建一个专门存储数据的类;分别存储响应状态码code,响应数据,传输的消息。 public class CommonData {int code;Object data;String message;public CommonData(int code, String message…...

java 两个list比较,删除相同的元素

概述 在Java开发中,经常需要比较两个List并删除相同的元素。本文将介绍整个流程,并提供相应的代码示例,帮助新手开发者完成这个任务。 流程 下面是比较两个List并删除相同元素的流程: 代码示例 创建两个List 我们首先需要创建两…...

7-3 zust-sy4-10 回文诗

7-3 zust-sy4-10 回文诗 分数 10 作者 张银南 单位 浙江科技学院 回文诗是汉语特有的一种使用词序回环往复的修辞方法,正着读反着读都可以。明末浙江才女吴绛雪作《四时山水诗》,如夏景诗:香莲碧水动风凉,水动风凉夏日长。长日夏凉风动水&…...

【数据结构】排序--插入排序(希尔排序)

目录 一 基本思想 二 直接插入排序 三 希尔排序 一 基本思想 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为 止,得到一个新的有序序列 。 实际中我们玩扑克牌时,就用了插入排序的思想 二…...

“探寻服务器的无限潜能:从创意项目到在线社区,你会做什么?”

文章目录 每日一句正能量前言什么是服务器?服务器能做什么?服务器怎么用?部署创意项目,还是在线社区亦或做其他的?后记 每日一句正能量 未知的下一秒,千万不要轻言放弃。 前言 在数字化时代,服…...

Google I/O 2026 发布会大招不断,免费用户能体验哪些新功能?

Google I/O 2026 发布会大招频出,免费用户能体验哪些新功能?每年五月,硅谷山景城都会热闹一次。Google I/O 是谷歌一年一度的开发者大会,但这些年它早就不只是给开发者看的了,普通用户、科技媒体、竞争对手&#xff0c…...

打卡2026阿里云峰会

打卡2026阿里云峰会。 这次大会不仅在美丽的西湖边上, 还有几个新朋友要来。。...

多模态模型中图像生成器使用的扩散模型的组件

多模态模型中图像生成器使用的扩散模型组件 多模态模型中的图像生成器,通常不是一个单独网络,而是一套 条件扩散生成系统。典型输入是文本、图像、mask、bbox、姿态、深度图、边缘图、语义图、视频帧或多模态 embedding,输出是目标图像。 最常…...

用USRP B200mini和GNU Radio抓取大疆无人机位置:一个极客的无线安全实验手记

极客实验室:用USRP B200mini破解无人机通信协议实战指南 从零开始的SDR探险 去年夏天的一个傍晚,我在阳台上调试天线时,突然注意到头顶频繁掠过的无人机。这些飞行器究竟在传输什么数据?这个偶然的观察引发了我长达三个月的技术…...

Keil5编译报错‘Target not created’?别急着重装,先试试这几招(附常见原因排查清单)

Keil5编译报错‘Target not created’的深度排查指南 当Keil5编译时出现"Target not created"的提示,很多开发者第一反应是重装软件。但实际上,这个报错背后可能隐藏着多种原因,盲目重装不仅浪费时间,还可能掩盖真正的问…...

终极指南:如何在Mac上免费创建Windows启动盘(3步教程)

终极指南:如何在Mac上免费创建Windows启动盘(3步教程) 【免费下载链接】windiskwriter 🖥 Windows Bootable USB creator for macOS. 🛠 Patches Windows 11 to bypass TPM and Secure Boot requirements. &#x1f47…...

如何快速找回遗忘的压缩包密码:开源工具的完整使用指南

如何快速找回遗忘的压缩包密码:开源工具的完整使用指南 【免费下载链接】ArchivePasswordTestTool 利用7zip测试压缩包的功能 对加密压缩包进行自动化测试密码 项目地址: https://gitcode.com/gh_mirrors/ar/ArchivePasswordTestTool 你是否曾经为加密的压缩…...

Perplexity词组搭配查询深度解析(工业级语料验证版):基于127万条真实英文语境的搭配强度阈值模型首次公开

更多请点击: https://codechina.net 第一章:Perplexity词组搭配查询深度解析(工业级语料验证版):基于127万条真实英文语境的搭配强度阈值模型首次公开 Perplexity 不仅是语言模型评估的核心指标,更可转化为…...

A/B测试还在用t检验?DeepSeek团队淘汰传统方法的4个关键转折点(含贝叶斯动态决策引擎实测对比)

更多请点击: https://intelliparadigm.com 第一章:A/B测试范式迁移的必然性 传统A/B测试长期依赖静态流量分配、固定实验周期与人工决策闭环,在现代高并发、多场景、实时反馈的业务系统中正面临三重结构性失配:实验吞吐量低、决策…...

从DICOM到3D打印:手把手教你用3D Slicer处理医学影像全流程(含STL导出)

从DICOM到3D打印:医学影像处理全流程实战指南 在数字化医疗时代,将CT、MRI等医学影像转化为可触摸的3D打印模型,正在成为临床教学、手术规划和医患沟通的革命性工具。这套技术链条中最关键的桥梁,正是开源的3D Slicer平台——它能…...