【Compose multiplatform教程】01 创建你的多平台项目 <官网搬运>

news2024/12/12 13:28:13

这是 “创建带有共享逻辑和用户界面的 Compose 多平台应用” 教程的第一部分。

第一步:创建你的多平台项目
第二步:探究可组合代码
第三步:修改项目
第四步:创建你自己的应用程序

在这里,你将学习如何使用 Kotlin 多平台网络向导和 Android Studio 来创建并运行你的首个 Compose 多平台应用程序。

借助 Compose 多平台用户界面框架,你能够将 Kotlin 多平台的代码共享能力拓展到应用逻辑之外。你可以一次性实现用户界面,然后将其应用于 Compose 多平台所支持的所有平台。

在本教程中,你将构建一个可在安卓、iOS、桌面端以及网页端运行的示例应用程序。为了创建用户界面,你将使用 Compose 多平台框架,并学习它的基础知识,包括可组合函数、主题、布局、事件以及修饰符。

本教程的注意事项:

无需事先具备 Compose 多平台、安卓或 iOS 方面的经验。不过我们建议你在开始之前先熟悉 Kotlin 的基础知识。

要完成本教程,你只需要用到 Android Studio。它能让你在安卓和桌面端尝试多平台开发。对于 iOS 开发,你需要一台装有 Xcode 的 macOS 电脑,这是 iOS 开发的一个普遍限制条件。

如果你愿意,可以只选择你感兴趣的特定平台,而忽略其他平台。

若想尝试全新的多平台开发体验,又不想在不同的集成开发环境之间来回切换以及为编写 Swift 代码而打开 Xcode,不妨看看 JetBrains Fleet 是如何处理多平台项目的。

搭建环境
如果你还没有查看过关于为 Kotlin 多平台开发搭建环境的文章,那就去看看吧。确保你已完成以下事项:

为 Android Studio 安装 Kotlin 多平台插件。

如果你计划构建 iOS 应用程序,至少启动一次 Xcode 并接受使用条款。

运行 Kdoctor 来检查搭建过程中是否存在问题。

以下操作指南假定你已具备针对目标平台所需的全部软件。

使用向导创建项目
首先,创建一个示例项目。使用 Kotlin 多平台网络向导来创建是最佳途径:

1: 打开 Kotlin 多平台向导。

https://kmp.jetbrains.com/?_gl=1*hamo2k*_gcl_au*MjA1NzI5MjMzNC4xNzMzNjUxODIw*_ga*MTgxMDU5NDAzNC4xNzA4MjIzNzEz*_ga_9J976DJZ68*MTczMzY1NzM1MC41LjEuMTczMzY1NzM4NC4yNi4wLjA.

2:在 “新建项目” 选项卡中,将项目名称更改为 “ComposeDemo”,项目 ID 更改为 “compose.project.demo”。

3:选择 “安卓”“桌面端” 以及 “网页” 选项。

4:如果你使用的是 Mac 电脑,也要选择 “iOS” 选项。确保选中 “共享用户界面” 选项。

5:点击 “下载” 按钮,然后解压生成的压缩包。

编写代码。

检查项目结构

1:启动 Android Studio。

2:在欢迎界面,点击 “打开”,或者在编辑器中选择 “文件”->“打开”。

3:导航至解压后的 “ComposeDemo” 文件夹,然后点击 “打开”。Android Studio 会检测到该文件夹包含一个 Gradle 构建文件,并将该文件夹作为新项目打开。

如果你在向导中没有选择 “iOS” 选项,那么你将不会看到名称以 “ios” 或 “apple” 开头的文件夹。

Android Studio 中的默认视图是针对安卓开发进行优化的。要查看更便于多平台开发的项目完整文件结构,需将视图从 “android” 切换为 “project”。

4:点击“Open”后出现“Cannot resolve module”错误怎么解决?

在Android Studio中如何切换到“项目”视图?

如何在Android Studio中运行一个Compose项目?

该项目包含两个模块:

“composeApp” 是一个 Kotlin 模块,它包含了安卓、桌面端、iOS 以及网页应用之间共享的逻辑 —— 也就是可用于所有平台的代码。它使用 Gradle 作为构建系统,Gradle 有助于实现构建流程的自动化。

“iosApp” 是一个 Xcode 项目,其构建结果为一个 iOS 应用程序。它依赖 “composeApp” 这个共享模块,并将其作为一个 iOS 框架来使用。

“composeApp” 模块由以下源集组成:“androidMain”、“commonMain”、“desktopMain”、“iosMain” 以及 “wasmJsMain”。源集是 Gradle 中的一个概念,指的是逻辑上分组在一起的若干文件,每个组都有其自身的依赖关系。在 Kotlin 多平台中,不同的源集可针对不同的平台。

“commonMain” 源集使用通用的 Kotlin 代码,而各个平台源集则使用特定于每个目标平台的 Kotlin 代码。“Kotlin/JVM” 用于 “androidMain” 和 “desktopMain” 源集;“Kotlin/Native” 用于 “iosMain” 源集;另一方面,“Kotlin/Wasm” 用于 “wasmJsMain” 源集。

当共享模块被构建为安卓库时,通用的 Kotlin 代码会被当作 “Kotlin/JVM” 来处理;当它被构建为 iOS 框架时,通用的 Kotlin 代码会被当作 “Kotlin/Native” 来处理;当共享模块被构建为网页应用时,通用的 Kotlin 代码会被当作 “Kotlin/Wasm” 来处理。

一般来说,只要有可能,就要将你的实现写成通用代码,而不是在特定平台的源集中重复功能。

在 “composeApp/src/commonMain/kotlin” 目录下,打开 “App.kt” 文件。该文件包含 “App ()” 函数,这个函数实现了一个简约但完整的 Compose 多平台用户界面:

@Composable
@Preview
fun App() {
    MaterialTheme {
        var showContent by remember { mutableStateOf(false) }
        Column(Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally) {
            Button(onClick = { showContent = !showContent }) {
                Text("Click me!")
            }
            AnimatedVisibility(showContent) {
                val greeting = remember { Greeting().greet() }
                Column(Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally) {
                    Image(painterResource(Res.drawable.compose_multiplatform), null)
                    Text("Compose: $greeting")
                }
            }
        }
    }
}

运行你的应用程序                  

你可以在安卓、iOS、桌面端以及网页端运行该应用程序。你无需按照特定顺序来运行这些应用,所以可以从你最熟悉的平台开始运行。

你无需使用 Gradle 构建任务。在多平台应用程序中,使用该任务会构建所有支持目标的调试版本和发布版本。依据在多平台向导中所选择的平台情况,这可能会花费一些时间。而使用运行配置则要快得多,在这种情况下,只会构建所选的目标平台版本。

在安卓平台上运行你的应用程序。

1:创建一个安卓虚拟设备。

2:在运行配置列表中,选择 “composeApp”。

选择你的安卓虚拟设备,然后点击 “运行”:如果所选的安卓虚拟设备处于关机状态,Android Studio 将会启动它,并运行该应用程序

在 iOS 平台上运行你的应用程序

1:在单独的窗口中启动 Xcode 以完成初始设置。如果是首次启动 Xcode,你可能还需要接受其许可条款,并允许它执行一些必要的初始任务。

2:在 Android Studio 中,在运行配置列表里选择 “iosApp”,然后点击 “运行”。默认情况下,该运行配置会启动 Xcode 中可用的模拟设备,并在该设备上运行应用程序。如果列表中没有可用的 iOS 配置,那就添加一个新的运行配置。

在新的 iOS 模拟设备上运行

如果你想在模拟设备上运行你的应用程序,可以添加一个新的运行配置。

1:在运行配置列表中,点击 “编辑配置”。

2:点击配置列表上方的 “+” 按钮,然后选择 “iOS  Application”。

3:为你的配置命名。

4:选择 Xcode 项目文件。为此,导航至你的项目(例如,KotlinMultiplatformSandbox 项目),打开 “iosApp” 文件夹,然后选择 “.xcodeproj” 文件。

5:在 “执行目标” 列表中,选择一个模拟设备,然后点击 “确定”。

6:点击 “运行”,以便在新的模拟设备上运行你的应用程序。

在真实的 iOS 设备上运行。

你可以在真实的 iOS 设备上运行你的多平台应用程序。在开始操作前,你需要设置与你的 “苹果 ID” 关联的Team ID。

 

设置你的 “Team ID”
要在你的项目中设置 “Team ID”,你既可以使用 Android Studio 中的 KDoctor 工具,也可以在 Xcode 中选择你的团队。

 

对于 KDoctor:

1:在Android Studio中,在终端里运行以下命令:

kdoctor --team-ids

KDoctor 将会列出当前在你系统上配置好的所有Team ID,例如:

3ABC246XYZ (Max Sample)
ZABCW6SXYZ (SampleTech Inc.)

2:在Android Studio中,打开 “iosApp/Configuration/Config.xcconfig” 文件,并指定你的Team ID

或者,在 Xcode 中选择团队:

1:前往 Xcode 并选择 “Open a project or file.”。

2:导航至你项目的 “iosApp/iosApp.xcworkspace” 文件。

 

3:在左侧菜单中,选择 “iosApp”。

 

4:导航至 “Signing & Capabilities.” 选项。

 

5:在 “Team” 列表中,选择你的Team。

 

6:如果你尚未设置你的团队,可使用 “Team” 列表中的 “Add an Account” 选项,并按照 Xcode 中的指示操作。

 

确保 “包标识符” 是唯一的,并且 “签名证书” 已成功分配。

运行该应用程序

用数据线将你的 iPhone 连接起来。如果你已经在 Xcode 中注册过该设备,安卓工作室应该会在运行配置列表中显示它。运行相应的 iOS 应用程序配置。

 

如果你尚未在 Xcode 中注册你的 iPhone,按照苹果公司的建议操作。简而言之,你应该:

  1. 使用数据线连接你的 iPhone。
  2. 在你的 iPhone 上,在 “设置” 中的 “隐私与安全” 里启用开发者模式。
  3. 在 Xcode 中,进入顶部菜单并选择 “窗口”|“设备与模拟器”。
  4. 点击加号。选择你已连接的 iPhone 并点击 “添加”。
  5. 使用你的苹果 ID 登录,以便在该设备上启用开发功能。
  6. 按照屏幕上的提示完成配对流程。
  7. 一旦你已在 Xcode 中注册了你的 iPhone,就在安卓工作室中创建一个新的运行配置,并在 “执行目标” 列表中选择你的设备,然后运行相应的 iOS 应用程序配置。

在桌面上运行你的应用程序

你可以按以下步骤创建用于运行桌面应用程序的运行配置:

  1. 从主菜单中选择 “运行”|“编辑配置”。
  2. 点击 “+” 按钮,并从下拉列表中选择 “Gradle”。
  3. 在 “任务和参数” 字段中,粘贴以下这条命令然后点击确定:
composeApp:run

现在,你可以使用这个配置在其所属操作系统窗口中运行桌面应用程序:

运行你的网络应用程序
创建一个运行配置来运行网络应用程序:

  1. 从主菜单中选择 “运行”|“编辑配置”。
  2. 点击 “+” 按钮,并从下拉列表中选择 “Gradle”。
  3. 在 “任务和参数” 字段中,粘贴以下这条命令并点击确定:
wasmJsBrowserRun -t --quiet

现在,你可以使用这个配置来运行网络应用程序。

 网络应用程序会在你的浏览器中自动打开。或者,当运行结束时,你也可以在浏览器中输入以下网址:

http://localhost:8080/

端口号可能会有所不同,因为 8080 端口可能不可用。你可以在 Gradle 构建控制台中找到实际的端口号。

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

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

相关文章

使用OpenTK展示3D点云图像(C#)

最近在研究3D显示,找到一款在winform上展示3D点云的控件,并且实现了点线面的展示,及光照渲染纹理贴图等功能,如下面几张图所展示。 一些基础知识可以在LearnOpenTK - OpenTK 这个网站上学习到。 我这边使用的是openTK3.3.3版本&a…

李宏毅机器学习-批次 (batch)和动量(momentum)

一.batch(批次) 在计算微分时,不是对所有的数据算出来的Loss值做微分,而是将所有的数据分成一个一个的batch。一个batch是一个B,在更新参数时,拿B的资料计算Loss,计算gradient,再更新…

洗鞋小程序(源码+文档+部署+讲解)

本文将深入解析“洗鞋小程序”的项目,探究其架构、功能以及技术栈,并分享获取完整源码的途径。 系统概述 为洗鞋提供服务,包含小程序和管理端。 本项目名称为洗鞋小程序,是一个基于小程序的在线洗鞋平台。该系统提供下单、订单管…

【数据结构】二叉树的性质和存储结构

性质 在二叉树的第i层上至多有2^{i-1}个结点,至少有1个结点 深度为k的二叉树至多有2^{k-1}个结点(k≥1),至少有k个结点 对任何一棵二叉树T,如果其叶子数为n0,度为2的结点数为n2,则n0n21 具有n个结点的完…

交换排序(Swap Sort)详解

交换排序Swap Sort详解 冒泡排序冒泡算法代码实现冒泡分析 快速排序快排算法代码实现快排分析 交换类排序主要是通过两两比较待排元素的关键字,若发现与排序要求相逆,则交换之。在这类排序方法中最常见的是起泡排序(冒泡排序)和快…

MySQL追梦旅途之性能优化

1、索引优化 索引可以显著加速查询操作,但过多或不适当的索引也会带来负面影响(如增加写入开销)。因此,选择合适的索引至关重要。 创建索引: 为经常用于WHERE子句、JOIN条件和ORDER BY排序的列创建索引。 CREATE I…

小程序IOS安全区域优化:safe-area-inset-bottom

ios下边有一个小黑线,位于底部的元素会被黑线阻挡 safe-area-inset-bottom 一 用法及作用: IOS全面屏底部有小黑线,位于底部的元素会被黑线阻挡,可以使用以下样式: .model{padding-bottom: constant(safe-area-ins…

矩阵的乘(包括乘方)和除

矩阵的乘分为两种: 一种是高等代数中对矩阵的乘的定义:可以去这里看看包含矩阵的乘。总的来说,若矩阵 A s ∗ n A_{s*n} As∗n​列数和矩阵 B n ∗ t B_{n*t} Bn∗t​的行数相等,则 A A A和 B B B可相乘,得到一个矩阵 …

解决阿里云轻量级服务器 Ubuntu 24.04.1 LTS 没网也 ping 不通 8.8.8.8 以及 route -n 没有输出任何转发信息

事情发生在两天前,位于公网的阿里云轻量级服务器(Ubuntu 24.04.1 LTS)忽然没网。主要是上次上服务器进行配置已经是一个多月前,最近也没有做什么事情,就忽然没网了,让人纳闷。更主要的是,上次备…

Cesium中实现仿ArcGIS三维的动态图层加载方式

Cesium 加载 ArcGIS 动态图层的方式 如果你在 Cesium 中加载过 ArcGIS 的动态图层,你会发现,Cesium 对于动态图层仍然采用类似切片图层的逻辑进行加载。也就是每个固定的瓦片 export 一张图片。 这样会造成一些问题: 请求量大,…

Tablesaw封装Plot.ly实现数据可视化

上文介绍tablesaw的数据处理功能,本文向你展示其数据可视化功能,并通过几个常用图表示例进行说明。 Plot.ly包装 可视化是数据分析的重要组成部分,无论你只是“查看”新数据集还是验证机器学习算法的结果。Tablesaw是一个开源、高性能的Java…

智慧商城项目2(vue核心技术与实战)

页面访问拦截了解 router/index.js import Vue from vue import VueRouter from vue-router import Login from /views/login import Layout from /views/layout import Search from /views/search import SearchList from /views/search/list import Prodetail from /views/…

第一个C++程序--(蓝桥杯备考版)

第一个C程序 基础程序 #include <iostream>//头⽂件 using namespace std;//使⽤std的名字空间 int main()//main函数 {cout << "hello world!" << endl; //输出&#xff1a;在屏幕打印"hello world!" return 0;}main函数 main 函数是…

华为云域名网站,域名切换到Cloudflare CDN出现访问报错:DNS 重定向次过多

网站域名切换到Cloudflare出现访问报错&#xff1a;重定向次过多&#xff0c;应该如何处理&#xff1f; 最近我自己已经遇到很多次这个情况了&#xff0c;将网站域名DNS切换到Cloudflare之后&#xff0c;网站会打不开&#xff0c;出现重定向次数过多报错。 网站域名切换到Clo…

颜色的基本处理

数码相机能够获取彩色图像&#xff0c;但相机的色彩处理是一个非常复杂的过程&#xff0c;是非常重要的。 此过程生产制造商在细节方面都是不公布的&#xff0c;但是基本的概念是相同的。当相机捕捉一个真实场景时&#xff0c;是怎么还原成人眼所看到的图像呢&#xff1f; 1.R…

与 Cursor AI 对话编程:2小时开发报修维修微信小程序

本文记录了如何通过与 Cursor AI 对话&#xff0c;全程不写一行代码的情况下&#xff0c;完成一个完整的报修小程序。整个过程展示了 AI 如何帮助我们&#xff1a; 生成代码 、解决问题、优化实现、完善细节。 先看一下效果图&#xff1a; 一、项目配置 首先我是这样和 AI 对…

System.Data.OracleClient 需要 Oracle 客户端软件 version 8.1.7 或更高版本

问题1&#xff1a;“/”应用程序中的服务器错误。 System.Data.OracleClient 需要 Oracle 客户端软件 version 8.1.7 或更高版本。 说明: 执行当前 Web 请求期间&#xff0c;出现未经处理的异常。请检查堆栈跟踪信息&#xff0c;以了解有关该错误以及代码中导致错误的出处的详细…

leetcode909:蛇梯棋

给你一个大小为 n x n 的整数矩阵 board &#xff0c;方格按从 1 到 n2 编号&#xff0c;编号遵循 转行交替方式 &#xff0c;从左下角开始 &#xff08;即&#xff0c;从 board[n - 1][0] 开始&#xff09;的每一行改变方向。 你一开始位于棋盘上的方格 1。每一回合&#xf…

【特殊子序列 DP】力扣552. 学生出勤记录 II

可以用字符串表示一个学生的出勤记录&#xff0c;其中的每个字符用来标记当天的出勤情况&#xff08;缺勤、迟到、到场&#xff09;。记录中只含下面三种字符&#xff1a; ‘A’&#xff1a;Absent&#xff0c;缺勤 ‘L’&#xff1a;Late&#xff0c;迟到 ‘P’&#xff1a;Pr…

Datawhale AI 冬令营(第一期)定制你的第一个专属模型-学习笔记

最近我报名参加了Datawhale组织的主题为“动手学系列&#xff0c;人人都能应用的AI”的Datawhale AI冬令营&#xff08;第一期&#xff09;。 本次学习一共12天&#xff0c;从12月10日-12月21日&#xff0c;学习会包含【跑通速通手册】&#xff0c;【学习大模型微调&数据集…