【译】快速开始 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

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

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

相关文章

GitHub验证的2FA

一、 起因: GitHub需要双重身份验证 (2FA) 是登录网站或应用时使用的额外保护层。启用 2FA 时,必须使用您的用户名和密码登录,并提供另一种只有您知道或可以访问的身份验证形式。 二、解决: 2.1 这里使用chrome的身份验证插件进…

在emacs中,设置latex的主文档

文档: chapter1.tex chapter2.tex main.tex 在chapter1.tex中,先按下 ctrlc ctrln,再按下ctrlc ctrla,在下方的提示框中输入主文档。

支付宝小程序介入人脸识别(金融级--前端部分)

在这里只做前端部分说明: 详情参考文档:如何通过集成支付宝小程序唤起实人认证服务_实人认证-阿里云帮助中心 操作步骤 调用 API 发起认证。 发起认证服务。 调用 startBizService 接口请求认证。 function startAPVerify(options, callback) {my.call(startBizService, {n…

AWS S3加密

Hello大家好。 在本课时我们将讨论S3加密相关的内容。 S3加密相关是认证考试的一个重要的主题考点,您需要了解亚马逊S3的几种不同类型的加密方式。| 首先是静态数据的加密,静态数据加密是指数据存储在亚马逊S3 数据中心的磁盘上时&#xff0…

stable diffusion和midjourney哪个好

midjourney和stable diffusion哪个好?midjourney和stable diffusion的区别?那么今天就从这2款软件入手,来探索一下他们的功能的各项区别吧,让你选择更适合你的一款ai软件。 截至目前,我们目睹了生成式人工智能工具的在…

Linux —— 网络基础(一)

目录 一,计算机网络背景 二,网络协议初识 三,网络传输基本流程 四,网络中的地址管理 一,计算机网络背景 网络发展 独立模式,计算机之间相互独立;网络互联,多台计算机连接在一起…

【OpenCV实现图片以及视频的读取、显示、保存以及绘图函数】

文章目录 图片视频从文件读取视频保存一个视频绘图函数 图片 OpenCV(Open Source Computer Vision Library)是一个广泛应用于计算机视觉和图像处理领域的开源库。它提供了丰富的图像处理工具和算法,使得开发者能够轻松实现各种图像处理任务。…

科普丨语音芯片烧录流程概述

语音芯片的烧录是将特定的固件或软件加载到芯片中,以使其能够执行特定的语音处理功能。以下是一般的语音芯片烧录过程: 1. 准备固件或软件:开发人员需要编写或获取特定的固件或软件,这些固件或软件包含了语音处理算法和功能的代码…

【周末闲谈】VR新视界,“眼”见未来

个人主页:【😊个人主页】 系列专栏:【❤️周末闲谈】 系列目录 ✨第一周 二进制VS三进制 ✨第二周 文心一言,模仿还是超越? ✨第二周 畅想AR 文章目录 系列目录前言虚拟现实(VR)技术虚拟现实技术的原理虚拟现实技术发…

高精度时间测量(TDC)电路MS1022

MS1022 是一款高精度时间测量电路,内部集成了模拟比 较器、模拟开关、施密特触发器等器件,从而大大简化了外 围电路。同时内部增加了第一波检测功能,使抗干扰能力大 大提高。通过读取第一个回波脉冲的相对宽度,用户可以获 得接…

laravel的默认首页怎么改-laravel框架默认欢迎页面如何修改

laravel的默认首页怎么改 搭建好的laravel的默认首页怎么改 我们有两种改动方式: 第一种修改默认路由: 下一步是要移除Laravel应用程序默认的欢迎页路由。这个路由可以在routes/web.php文件的顶部找到,看起来类似于以下代码: …

OpenGL —— 2.7、绘制多个自旋转的贴图正方体(附源码,glfw+glad)

源码效果 C源码 纹理图片 需下载stb_image.h这个解码图片的库,该库只有一个头文件。 具体代码: vertexShader.glsl #version 330 corelayout(location 0) in vec3 aPos; layout(location 1) in vec2 aUV;out vec2 outUV;uniform mat4 _modelMatrix; …

微信小程序进阶——Flex弹性布局轮播图会议OA项目(首页)

目录 一、Flex弹性布局 1.1 什么是Flex弹性布局 1.1.1 详解 1.1.2 图解 1.1.3 代码演示效果 1.2 Flex弹性布局的核心概念 1.3 Flex 弹性布局的常见属性 1.4 Flex弹性布局部分属性详解 1.4.1 flex-direction属性 1.4.2 flex-wrap属性 1.4.3 flex-flow属性 1.4.4 ju…

DFS(分布式文件系统)与 DFSR(分布式文件系统复制)的区别

DFS(分布式文件系统)和 DFSR(分布式文件系统复制)是两种不同的技术,尽管它们在名称上有一些相似之处,但它们的用途和功能有所不同。 DFS(分布式文件系统) DFS 是一种用于创建和管理…

Win10系统开机启动文件夹在哪里找?

Win10系统开机启动文件夹在哪里找?Win10系统开机启动文件夹是一个非常重要的目录,它决定了电脑在开机的时候,会有哪些应用程序是自动启动。但是,很多新手用户不知道Win10电脑内开机启动文件夹的具体位置,下面小编介绍开…

eNSP笔记②

动态路由 RIP [适用于小型网络] 静态路由是加上非直连的网段,动态路由是加上直连的网段 动态路由就是要宣告它要去的网段,在图中可以看到,一台路由需要宣告两个网段,路由A分别宣告10.0.0.0与192.168.1.0,路由B宣告10.…

ArcGIS在VUE框架中的构建思想

项目快要上线了,出乎意料的有些空闲时间。想着就把其他公司开发的一期代码里面,把关于地图方面的代码给优化一下。试运行的时候,客户说控制台有很多飘红的报错,他们很在意,虽然很不情愿,但能改的就给改了吧…

JSX的本质

一、本质 React.createElement即h函数,返回vnode第一个参数,可能是组件,也可能是html tag组件名,首字母必须大写(React规定) 二、babel试一试 (babel集成了jsx的编译环境) // JSX…

matlab奇技淫巧——绘制三维地图

在数据处理工作中,常常会用到地图的绘制,最常用的自然是绘制平面的区域/全球地图,通过 worldmap(world) % 创建世界地图坐标区域 load coastlines % 导入海岸线数据 plotm(coastlat,coastlon)即可绘制,效果…

Talk | UCSD博士生刘明华:在开放的世界中理解和生成3D物体

本期为TechBeat人工智能社区第539期线上Talk。 北京时间10月19日(周四)20:00,加州大学圣地亚哥分校博士生—刘明华的Talk已准时在TechBeat人工智能社区开播! 他与大家分享的主题是: “在开放的世界中理解和生成3D物体”&#xff0…