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

news2025/7/19 6:49:50

原文: 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
    [✓] Cocoapods
    
    Conclusion:
      ✓ 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

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

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

相关文章

极品三国新手攻略之进阶篇

尊敬的主公大人您好,首先恭喜您在游戏中取得的不俗成绩,相信您已经熟练掌握了不少玩法。今天,我们给大家奉上一份极品三国新手攻略之进阶篇,希望能为您提供有力的帮助。本篇攻略将为您深入分析游戏中武将、装备、试炼塔以及神兵等…

【微服务 SpringCloud】实用篇 · Ribbon负载均衡

微服务(4) 文章目录 微服务(4)1. 负载均衡原理2. 源码跟踪1)LoadBalancerIntercepor2)LoadBalancerClient3)负载均衡策略IRule4)总结 3. 负载均衡策略3.1 负载均衡策略3.2 自定义负载…

“升级是找死,不升级是等死”,GitLab CE 的痛苦升级之路

编者按:本文转载自公众号运维识堂,已经联系作者取得转载授权。 GitLab 在发展的十余年中,在国内积累了大量的 CE 用户,但是很多 CE 用户并不会跟随 GitLab 的发版节奏(月度发版)进行版本升级,在…

基于AT89C52+ADC0809+LCD1602的模数转换实验ptoteus仿真设计

一、仿真原理图: 二、仿真效果图: 三、仿真工程: 基于AT89C52ADC0809LCD1602的模数转换实验ptoteus仿真设计资源-CSDN文库

flask实战(问答平台)

问答平台项目结构搭建 先创建一个配置文件config.py,后面有些配置写在这里 #app.py from flask import Flask import configapp Flask(__name__) #绑定配置文件 app.config.from_object(config)app.route(/) def hello_world(): # put applications code herer…

数据结构-----红黑树的删除操作

目录 前言 一、左旋和右旋 左旋(Left Rotation) 右旋(Right Rotation) 二、红黑树的查找 三、红黑树的删除 1.删除的是叶子节点 1.1删除节点颜色为红色 1.2删除节点颜色为黑色 1.2-1 要删除节点D为黑色,兄弟节…

git 提交代码

提交代码流程 第一步:git status 第二步:git add . 第三步:git commit -m"xxx" 第四步:git pull origin dev 第五步:git push origin dev

HEIC转jpg

下载imagemagick,安装 https://imagemagick.org/archive/binaries/ImageMagick-7.1.1-20-Q16-HDRI-x64-dll.exe cmd D:\soft\ImageMagick-7.1.1-Q16-HDRI\magick.exe "C:\Users\Gamer\Downloads\iCloud 照片1\iCloud 照片\IMG_3889.HEIC" IMG_3889.jpg

不懂的东西

1、 2、 3、 4、 5、我看到那篇 Peace of mind 论文,有一个疑问,为什么论文里的量表用的频率指标?比如Some of the time, Not at all等,而PANAS用的是程度指标,比如moderately,a little等。…

一、初识 Elasticsearch:概念,安装,设置分词器

文章目录 01、初识 Elasticsearch正向索引和倒排索引索引MySQL与ES的概念映射安装ES分词器分词器的设置 01、初识 Elasticsearch 本次ES基于:7.12.1 版本 学习资源为:https://www.bilibili.com/video/BV1Gh411j7d6 什么是ES(Elasticsearch&…

C/C++笔试易错与高频题型图解知识点(二)—— C++部分(持续更新中)

目录 1.构造函数初始化列表 1.1 构造函数初始化列表与函数体内初始化区别 1.2 必须在初始化列表初始化的成员 2 引用&引用与指针的区别 2.1 引用初始化以后不能被改变,指针可以改变所指的对象 2.2 引用和指针的区别 3 构造函数与析构函数系列题 3.1构造函数与析…

力扣环形链表(1)进阶环形链表(2)及环形链表的约瑟夫问题

为了加深对环形链表的理解和掌握,这两道题是很不错的选择。 这里所说环形链表不是一个圈圈的结构,而是带环链表。 链接:环形链表(1) 注意这里链表的长度 所以要注意链表是否为空 第一种方法,应该是比较容易…

竞赛选题 深度学习中文汉字识别

文章目录 0 前言1 数据集合2 网络构建3 模型训练4 模型性能评估5 文字预测6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习中文汉字识别 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐&#xf…

影响多用户商城系统价格的因素有哪些?

多用户商城系统作为电商行业不可或缺的重要工具,其价格是众多商家关注的焦点。下面就影响多用户商城系统价格的因素有哪些作一些简单的介绍,希望对大家有所帮助(仅供参考)。 一、系统规模和功能 多用户商城系统的价格首先由其规模和功能决定。规模包括用…

如何使用RockPlus MES系统帮助SMT行业实现降本增效

SMT(Surface Mount Technology)是现代电子行业中主要的组装技术,广泛应用于电子产品的生产。SMT工艺涵盖了锡膏印刷、元器件贴装和回流焊接。经过这些关键工序,元器件被精确固定在电路板上,完成一个电子产品组装。 SM…

Java并发面试题:(五)volatile关键字

volatile 是什么 一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义: 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值&#xff0c…

网工内推 | 南天软件,base北京,需持有CCIE认证,最高25k

01 北京南天软件有限公司 招聘岗位:IPT运维工程师 职责描述: 负责客户Cisco语音网络IPT ,CUCM的日常运维,扩容和项目支持,支持路由交换,无线等项目,实施工作以及相关实施文档。 任职要求: 1、…

css 特别样式记录

一、 这段代码神奇的地方在于, 本来容器的宽度只有1200px,如果不给img赋予宽度100%,那么图片 会超出盒子,如果给了img赋予了宽度100%,多个图片会根据自己图片大小的比例,去分完那1200px,如图二。…

【LeetCode热题100】--75.颜色分类

75.颜色分类 方法一&#xff1a;使用单指针 class Solution {public void sortColors(int[] nums) {int n nums.length;int ptr 0;for(int i 0;i<n;i){if(nums[i] 0){int tmp nums[i];nums[i] nums[ptr];nums[ptr] tmp;ptr;}}for(int i ptr;i<n;i){if(nums[i] …

Linux:mongodb数据逻辑备份与恢复(3.4.5版本)

我在数据库aaa的里创建了一个名为tarro的集合&#xff0c;其中有三条数据 备份语法 mongodump –h server_ip –d database_name –o dbdirectory 恢复语法 mongorestore -d database_name --dirdbdirectory 备份 现在我要将aaa.tarro进行备份 mongodump --host 192.168.254…