/   今日科技快讯   /

近日,有消息称百度3月将推出ChatGPT风格服务。经百度确认,该项目名字确定为文心一言,英文名ERNIE Bot,三月份完成内测,面向公众开放。

目前,文心一言在做上线前的冲刺。百度方面表示,ChatGPT相关技术,百度都有。百度在人工智能四层架构中,有全栈布局。包括底层的芯片、深度学习框架、大模型以及最上层的搜索等应用。文心一言,位于模型层。

/   作者简介   /

本篇文章转自黄林晴的博客,文章主要分享了如何使用Compose来进行IOS开发,相信会对大家有所帮助!

原文地址:

https://juejin.cn/post/7195770699524751421

/   前言   /

在之前,我们已经体验了Compose for Desktop与Compose for Web,目前Compose for IOS已经有尚未开放的实验性API,乐观估计今年年底将会发布 Compose for IOS。同时Kotlin也表示将在2023年发布KMM的稳定版本。

届时Compose-jb + KMM将实现Kotlin全平台。

/   搭建项目   /

创建项目

因为目前Compose for iOS阶段还在试验阶段,所以我们无法使用Android Studio或者IDEA直接创建Compose支持IOS的项目,这里我们采用之前的方法,先使用Android Studio创建一个KMM项目,如果你不知道如何创建一个KMM项目,可以参照之前的这篇文章KMM的初次尝试~,项目目录结构如下所示。

创建好KMM项目后我们需要添加Compose跨平台的相关配置。

添加配置

首先在settings.gradle文件中声明compose插件,代码如下所示:

pluginManagement {repositories {google()gradlePluginPortal()mavenCentral()maven("https://maven.pkg.jetbrains.space/public/p/compose/dev")}plugins {val composeVersion = extra["compose.version"] as Stringid("org.jetbrains.compose").version(composeVersion)}
}

这里compose.version的版本号是声明在gradle.properties中的,代码如下所示:

compose.version=1.3.0

然后我们在shared模块中的build文件中引用插件:

plugins {kotlin("multiplatform")kotlin("native.cocoapods")id("com.android.library")id("org.jetbrains.compose")
}

并为commonMain添加compose依赖,代码如下所示:

val commonMain by getting {dependencies {implementation(compose.ui)implementation(compose.foundation)implementation(compose.material)implementation(compose.runtime)}
}

sync之后,你会发现一个错误警告:uikit还处于试验阶段并且有许多bug....

uikit就是compose-jb暴露的UIKit对象。为了能够使用,我们需要在gradle.properties文件中添加如下配置:

org.jetbrains.compose.experimental.uikit.enabled=true

添加好配置之后,我们先来运行下iOS项目,确保添加的配置是无误的。果然,不运行不知道,一运行吓一跳。

这个问题困扰了我两三天,实在是无从下手,毕竟现在相关的资料很少,经过N次的搜索,最终解决的方案很简单:Kotlin版本升级至1.8.0就可以了。

kotlin("android").version("1.8.0").apply(false)

再次运行项目,结果如下图所示。

不过这是KMM的iOS项目,接下来我们看如何使用Compose编写iOS页面。

/   开始iOS之旅   /

我们替换掉iOSApp.swift中的原有代码,替换后的代码如下所示:

import UIKit
import shared@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {var window: UIWindow?func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {window = UIWindow(frame: UIScreen.main.bounds)let mainViewController = Main_iosKt.MainViewController()window?.rootViewController = mainViewControllerwindow?.makeKeyAndVisible()return true}
}

上面的代码看不懂没关系,我们只来看获取mainViewController的这一行:

let mainViewController = Main_iosKt.MainViewController()

Main_iosKt.MainViewController是通过新建在shared模块iOSMain目录下的main.ios.kt文件获取的,代码如下所示:

fun MainViewController(): UIViewController = Application("Login") { //调用一个Compose方法 }

接下来所有的事情就都可以交给Compose了。

图片实现一个登录页面

因为页面这部分是公用的,所以我们在shared模块下的commonMain文件夹下新建Login.kt文件,编写一个简单的登录页面,代码如下所示:

@Composable
internal fun login() {var userName by remember {mutableStateOf("")}var password by remember {mutableStateOf("")}Surface(modifier = Modifier.padding(30.dp)) {Column {TextField(userName, onValueChange = {userName = it}, placeholder = { Text("请输入用户名") })TextField(password, onValueChange = {password = it}, placeholder = { Text("请输入密码") })Button(onClick = {//登录}) {Text("登录")}}}
}

上述代码声明了一个用户名输入框、密码输入框和一个登录按钮,就是简单的Compose代码。然后需要在main.ios.kt中调用这个login方法:

fun MainViewController(): UIViewController =Application("Login") {login()}

运行iOS程序,效果如下图所示:

嗯~,Compose 在iOS上UI几乎可以做到100%复用,还有不学习Compose的理由吗?

实现一个双端网络请求功能

在之前的第1弹和第2弹中,我们分别实现了在Desktop、和Web端的网络请求功能,现在我们对之前的功能在iOS上再次实现。

添加网络请求配置

首先在shared模块下的build文件中添加网络请求相关的配置,这里网络请求我们使用Ktor,具体的可参照之前的文章:KMM的初次尝试~

配置代码如下所示:

val commonMain by getting {dependencies {...implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4")implementation("io.ktor:ktor-serialization-kotlinx-json:$ktorVersion")implementation("io.ktor:ktor-client-core:$ktorVersion")implementation("io.ktor:ktor-client-content-negotiation:$ktorVersion")implementation("io.ktor:ktor-serialization-kotlinx-json:$ktorVersion")}
}
val iosMain by getting {dependencies {implementation("io.ktor:ktor-client-darwin:$ktorVersion")}
}
val androidMain by getting {dependencies {implementation("io.ktor:ktor-client-android:$ktorVersion")}
}

添加接口

这里我们仍然使用wandroid中的每日一问接口。DemoReqData与之前系列的实体类是一样的,这里就不重复展示了。接口地址如下:

https://wanandroid.com/wenda/list/1/json

创建接口地址类,代码如下所示:

object Api {val dataApi = "https://wanandroid.com/wenda/list/1/json"
}

创建HttpUtil类,用于创建HttpClient对象和获取数据的方法,代码如下所示。

class HttpUtil {private val httpClient = HttpClient {install(ContentNegotiation) {json(Json {prettyPrint = trueisLenient = trueignoreUnknownKeys = true})}}/*** 获取数据*/suspend fun getData(): DemoReqData {val rockets: DemoReqData =httpClient.get(Api.dataApi).body()return rockets}
}

这里的代码我们应该都是比较熟悉的,仅仅是换了一个网络请求框架而已。现在公共的业务逻辑已经处理好了,只需要页面端调用方法然后解析数据并展示即可。

编写UI层

由于Android、iOS、Desktop三端的UI都是完全复用的,所以我们将之前实现的UI搬过来即可。代码如下所示:

Column() {val scope = rememberCoroutineScope()var demoReqData by remember { mutableStateOf(DemoReqData()) }Button(onClick = {scope.launch {try {demoReqData = HttpUtil().getData()} catch (e: Exception) {}}}) {Text(text = "请求数据")}LazyColumn {repeat(demoReqData.data?.datas?.size ?: 0) {item {Message(demoReqData.data?.datas?.get(it))}}}
}

获取数据后,通过Message方法将数据展示出来。这里只将作者与标题内容显示出来,代码如下所示:

@Composable
fun Message(data: DemoReqData.DataBean.DatasBean?) {Card(modifier = Modifier.background(Color.White).padding(10.dp).fillMaxWidth(), elevation = 10.dp) {Column(modifier = Modifier.padding(10.dp)) {Text(text = "作者:${data?.author}")Text(text = "${data?.title}")}}
}

分别运行iOS、Android程序,点击请求数据按钮,结果如下图:

这样我们就用一套代码,实现了在双端的网络请求功能。

/   一个尴尬的问题   /

我一直认为存在一个比较尴尬的问题,那就是像上面实现一个完整的双端网络请求功能需要用到KMM + Compose-jb,但是KMM与Compose-jb并不是一个东西,但是用的时候呢基本上都是一起用。Compose-jb很久之前已经发了稳定版本只是Compose-iOS目前还没有开放出来,而KMM当前还处于试验阶段,不过在2023年Kotlin的RoadMap中,Kotlin已经表示将会在23年中发布第一个稳定版本的KMM。而Compose for iOS何时发布,我想也是指日可待的事情。

所以,这个系列我觉得改名为:Kotlin跨平台系列更适合一些,要不然以后就会存在KMM跨平台第n弹,Compse跨平台第n弹....

因此,从第四弹开始,此系列将更名为:Kotin跨平台第N弹:~

/   写在最后   /

从自身体验来讲,我觉得KMM+Compose-jb对Android开发者来说是非常友好的,不需要像Flutter那样还需要额外学习Dart语言。所以,你觉得距离Kotlin一统“江山”的日子还会远吗?

推荐阅读:

我的新书,《第一行代码 第3版》已出版!

Android 13 Developer Preview一览

深度揭秘,Android应用是如何安装到手机上的

欢迎关注我的公众号

学习技术或投稿

长按上图,识别图中二维码即可关注

Compose跨平台又来了,这次能开发iOS了相关推荐

  1. java跨平台 ios_Smobiler如何实现.net一键开发,ios和android跨平台运行

    目录 一 概述 二 原理 移动端控件 移动端API 三 写在最后 一. 概述 Smobiler实现了.net服务端开发,ios和android客户端直接运行显示,无需学习Objective-C或Jav ...

  2. Compose跨平台第二弹:体验Compose for Web

    前言 在Compose跨平台第一弹:体验Compose for Desktop 中,我们已经了解了Compose-jb以及如何使用Compose-jb开发简单的桌面端应用,第二弹,我们就来了解下如何使 ...

  3. PySide是Python语言的Qt框架的一个绑定。PySide支持跨平台和本地GUI应用程序开发,是在Python 2.6、2.7和3.x版本下可用。

    PySide是Python语言的Qt框架的一个绑定.PySide支持跨平台和本地GUI应用程序开发,是在Python 2.6.2.7和3.x版本下可用. 在开始使用PySide之前,需要在你的机器上安 ...

  4. Flutter开发IOS,上架AppStore的全部流程以及常遇到的坑

    Flutter开发IOS,上架AppStore的全部流程以及常遇到的坑 本次开发采用的Flutter技术进行开发,没想到会这么快,昨天提交的,今天便已上架appstroe,所以这次来做一次总结,总结从 ...

  5. 直播网站源码直播平台软件开发iOS动手做一个直播(原理篇)

    直播网站源码直播平台软件开发iOS动手做一个直播(原理篇) 上篇文章主要给出了代码,但是并没有详细说明直播相关的知识,这篇文章就说一下直播的相关理论知识.附上直播代码篇地址. ###推流 腾讯直播平台 ...

  6. Windows11 上开发iOS是否可行呢?有什么解决方案呢

    许多 iOS 开发人员没有 Mac.这使得在 Windows 上进行 iOS 开发变得困难.很长一段时间以来,iOS 开发都无法在任何运行 macOS 的设备上进行.许多第三方跨平台解决方案,例如 P ...

  7. 用Qt第一次开发IOS的记录——Qt for IOS

    前言 我之前是个只开发电脑客户端的Qter,本来客户端都没整明白,结果现在开发ios app的任务落我头上,惊喜程度可想而知,为了它我学了qml,为了它我又开始问白痴问题了,为了它我调动了我整个人脉( ...

  8. 使用Qt开发iOS应用有何优劣?

    作者:JasonWong 链接:https://www.zhihu.com/question/25078050/answer/104635143 来源:知乎 著作权归作者所有.商业转载请联系作者获得授 ...

  9. xamarin c#开发ios/android 应用

    最近项目需要开发手机客户端,而现在项目又是微软的项目,所以正在考虑用xamarin c#开发ios 应用,这方面的资料不是很多,下面是一些资料的汇总 等研究一段时间再写的使用心得. xamarin 的 ...

最新文章

  1. php7 java8_php7 vs java8 vs nodejs5 vs lua5.2 计算性能比较
  2. 内嵌iframe撑高父容器,底部有4px留白问题解决办法
  3. 突然关机导致git文件受损,如何处理
  4. java timezone 107_java - Java使用TimeZone - 堆栈内存溢出
  5. 了解vue里的Runtime Only和Runtime+Compiler
  6. 阮一峰react demo代码研究的学习笔记 - demo4 debug - create element and Render
  7. 浪潮存储双活方案:新疆道路运输管理局的大数据应用不再是梦
  8. L-BFGS算法/Broyden族/BFGS算法/阻尼牛顿法的Python实现代码
  9. python apriori算法 sklearn_R 和 Python (numpy scipy pandas) 用于统计学分析,哪个更好?...
  10. Android 系统(228)---NITZ网络自动对时功能不起作用
  11. sql server 分区_使用分区归档SQL Server数据
  12. 微软7月修复117个漏洞,其中9个为0day,2个是Pwn2Own 漏洞
  13. 软件商业模式的发展与SaaS
  14. 电阻的种类以及选型要点
  15. 顺序表的基本操作(含全部代码c)
  16. 打破汽车零部件企业供应链壁垒,数商云SCM供应链系统实现一体化采购协同
  17. js去掉前后空格的函数_Node.js十年,你大爷还是你大爷
  18. 零基础开发NBIOT
  19. java小项目---------银行新用户现金业务办理(运用数据库)
  20. 2015(2016届)校园招聘季——内推 篇

热门文章

  1. NVM简单使用及出现NVM安装后没有npm的解决方法。
  2. z420开机无法进入BIOS,出现A9和光标
  3. C++俄罗斯方块源代码
  4. 《财报就像一本故事书》刘顺仁(一) 山西出版集团山西人民出版社
  5. 避开这四个雷区,你也可以策划出10万+创意素材! | 黎想
  6. 大数据时代,看完我和我的小伙伴都惊呆了
  7. display 用法
  8. KDD 2020最佳学生论文奖解读!杜克大学陈怡然组获奖-23
  9. android mvvm官方demo,Android MVVM实战Demo完全解析
  10. hadoop任务优化-调整Yarn队列资源