发布时间:2023-11-27 06:25:13 浏览量:128次
/ 前言 /
过完情人节后,大家是否为未来开始奋斗了呢?今天小编更新两个安卓开发岗位,话说现在Kotlin这么火了吗?安卓开发都在使用Kotlin开发。
近些年,不管是最初的RN还是到现在的Flutter、Compose,他们都在做着一件事——跨平台。
他们的成就主要都是在UI上跨平台,当然Flutter虽然可以处理一些公共的业务逻辑,但目前在业务较重的情况下仍然需要各自处理。
而KMM却与之相反,接下来让我们来一起了解一下吧~
/ 什么是KMM /
KMM 即 Kotlin Multiplatform Mobile是一个SDK,旨在简化跨平台移动应用程序的开发。通过KMM开发者可以在iOS和Android应用程序之间共享通用代码,并仅在必要时编写特定于平台的代码。
上面官方的描述说了这么多,简单的来说就是KMM注重业务逻辑跨平台,和Flutter、Compose完全相反。即使如此,在这个都想着跨别人的年代,KMM也称自己并没有说过不会做UI的跨平台...
/ KMM的HelloWorld /
环境配置
这里假设,你已经有了一台Mac、安装了高版本的AndroidStudio(这里不会介绍Xcode的配置),在AndroidStudio中搜索插件Kotlin Multiplatform Mobile并安装,如下图所示。
由于KMM还不是特别的成熟,所以建议开发者将Kotlin插件也升级到最新版本,避免出现一些兼容性问题。
创建项目
安装好插件并重启后,我们可以创建一个Kotlin Multiplatform App,如下图所示。
输入项目名称,选择对应的配置。
在iOS框架分发列表中,选择常规框架选项 (这里为了简单演示,实际项目根据所需选择即可)。点击Finish就创建了一个KMM的项目。
项目结构
创建完的KMM项目结构如下图所示。
androidApp、iOSApp就是对应的Android、iOS代码库,这里主要说一下shared共享模块,即存放Android、iOS公共业务逻辑的部分。
共享模块由三个源集组成:androidMain、commonMain和iosMain。源集是一个Gradle概念,用于逻辑上组合在一起的多个文件,其中每个组都有自己的依赖项。在Kotlin Multiplatform中,共享模块中的不同源集可以针对不同的平台。如下图所示。
支持多个目标的多平台库,可以在公共源集commonMain中使用。例如Koin、Apollo和Okio。
android和iOSMain,这些是来自相关生态系统的常规库。可以使用CocoaPods或其他依赖项管理器的原生iOS项目和使用Gradle的Android项目中使用。
运行程序
安装过KMM的插件,可以在AndroidStudio中选择iOS的虚拟机,前提必须是已经在Xcode或其他地方配置了iOS的虚拟机,如图所示。
我们这里仅运行Android程序,运行结果如下图所示。
这个结果来自shared模块中commonMain下的Greeting文件,代码如下所示。
class Greeting {
private val platform: Platform = getPlatform()
fun greeting(): String {
return "Hello, ${platform.name}!"
}
}
在iOS的手机上运行则会显示iOS版本号,这里交给读者自己去尝试了。因为我的电脑配置不允许我安装Xcode...
/ 实现元旦倒计时 /
接着我们看如何实现元旦倒计时的功能,其实就是计算现在距离元旦还有多少天。是不是有点似曾相识~
这一部分是公共逻辑,在shared目录中的build.gradle.kts文件中添加配置如下:
val commonMain by getting{
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.4.0")
}
}
在
shared/src/commonMain/kotlin目录下,创建新的Kotlin文件,代码如下所示:
import kotlinx.datetime.*
fun daysUntilNewYear(): Int {
val today = Clock.System.todayIn(TimeZone.currentSystemDefault())
val closestNewYear = LocalDate(today.year + 1, 1, 1)
return today.daysUntil(closestNewYear)
}
修改Greeting的greet方法如下所示。
fun greeting(): String {
return "距离元旦还有${daysUntilNewYear()}天"
}
运行程序,结果如下图所示。
在iOS手机中运行的效果也是一致的。
好吧,这个例子太简单了,稍微来个实用点的例子~
/ 实现网络请求功能 /
添加依赖
不管什么业务肯定要用到网络请求的功能,我们来看这部分的公共逻辑该怎么处理。
首先我们将用到依赖添加进来,这里主要有Kotlin协程、序列化(Ktor使用要求)、和Ktor,Ktor是一个可以用于HTTP请求的网络框架,如果读者不熟悉的话可自行查看。代码如下所示。
val commonMain by getting {
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.4.0")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4")
implementation("io.ktor:ktor-client-core:$ktorVersion")
implementation("io.ktor:ktor-client-content-negotiation:$ktorVersion")
implementation("io.ktor:ktor-serialization-kotlinx-json:$ktorVersion")
}
}
同时我们需要再androidMain和iOSMain目录下添加对应Ktor库,代码如下所示
val androidMain by getting {
dependencies {
implementation("io.ktor:ktor-client-android:$ktorVersion")
}
}
val iosMain by creating {
dependencies {
implementation("io.ktor:ktor-client-darwin:$ktorVersion")
}
}
这里ktorVersion的版本是2.1.2。
添加接口
这里我们仍然使用「wandroid」中的每日一问接口:
与在Compose中使用Paging分页库使用的接口和实体类是一样的,这里就不重复展示了。
创建接口地址类,代码如下所示。
object Api {
val dataApi = "https://wanandroid.com/wenda/list/1/json"
}
创建HttpUtil类,用于创建HttpClient对象和获取数据的方法,代码如下所示
class HttpUtil {
private val httpClient = HttpClient {
install(ContentNegotiation) {
json(Json {
prettyPrint = true
isLenient = true
ignoreUnknownKeys = true
})
}
}
/**
* 获取数据
*/
suspend fun getData(): String {
val rockets: DemoReqData =
httpClient.get(Api.dataApi).body()
return "${rockets.data} "
}
}
这里的代码我们应该都是比较熟悉的,仅仅是换了一个网络请求框架而已。现在公共的业务逻辑已经处理好了,只需要页面端调用方法然后解析数据并展示即可。这里我们仍然以Android实现为例。
实现页面层
在androidApp下编写Compose代码,代码比较简单,就是点击按钮请求数据,展示展示在文本中,代码如下所示。
setContent {
MyApplicationTheme {
Surface(
modifier = Modifier.fillMaxSize(), color = MaterialTheme.colors.background
) {
Column() {
val scope = rememberCoroutineScope()
var text by remember { mutableStateOf("正在加载") }
Button(onClick = {
scope.launch {
text = try {
Gson().toJson(HttpUtil().getData())
} catch (e: Exception) {
e.localizedMessage ?: "error"
}
}
}) {
Text(text = "请求数据")
}
Greeting(text)
}
}
}
}
这里我们并没有解析数据,仅仅是将请求的数据转化为Json串显示在文本中。运行程序,默认显示正在加载,点击按钮显示请求接口的数据。
这样我们就实现了网络请求的功能。
/ 写在最后 /
到这里,恭喜你,已经入门了KMM的使用,更多的使用方法需要在实际项目中不断地去总结,去尝试,Jetpack目前也在开发KMM版本,这对KMM发展将会是一个推进~
本文转载自公众号郭霖
作者:黄林晴
今日推荐:
安卓开发工程师
要求
1. 全日制统招本科毕业,1年左右安卓开发经验,可接受优秀23届应届生
2. 精通Android高级特性和SDK的使用,熟练掌握品牌手机和Android版本之间的区别;
7.需熟悉Kotlin开发
4. 熟练掌握Android各种调优工具,可以精确定位bug,熟练掌握IO,内存和CPU的优化;
5. 掌握Android端电量和流量优化技巧;
6. 掌握安卓中绘图机制;
7.有JNI编程优先的考虑。
薪资:15k-30k
工作地点:杭州
投递方式:Freemen App中定位杭州搜索安卓开发工程师
安卓开发实习生
要求
1、2023届本科及以上学历,计算机相关专业;
2、计算机基础扎实,熟悉数据结构、操作系统、计算机网络;
3、熟悉java或c/c++/objective-c;
4、对技术有热情,能够在指导后独立进行开发工作,对代码规范有要求;
薪资:4k-6k
工作地点:杭州
投递方式:Freemen App中定位杭州搜索安卓开发实习生
高级安卓开发工程师
1.计算机科学、软件工程或相关专业本科或以上学历。至少5年Android原生开发工作经验。
2.精通Java和Kotlin语言。
3.良好的自动化测试经验,包括单元测试和UI测试。
4.具有在Android和通用软件开发中使用常见设计模式的工作知识,如Reactive Patterns,MVVM。
5.高标准的代码质量、可维护性和性能。
6.有创建、维护和发布商业移动应用程序的经验。
7.有创建、维护和运输车辆配套应用程序经验者优先。
薪资范围:25k-28k
工作地点:上海
投递方式:如需投递可私信小编
以上就是今日最新推荐,时间不等人,最近找工作的不要错过,身边需要找工作的小伙伴也可以互相推荐~
热门资讯
探讨游戏引擎的文章,介绍了10款游戏引擎及其代表作品,涵盖了RAGE Engine、Naughty Dog Game Engine、The Dead Engine、Cry Engine、Avalanche Engine、Anvil Engine、IW Engine、Frostbite Engine、Creation引擎、Unreal Engine等引擎。借此分析引出了游戏设计领域和数字艺术教育的重要性,欢迎点击咨询报名。
游戏中玩家将面临武侠人生的挣扎抉择,战或降?杀或放?每个抉定都将触发更多爱恨纠葛的精彩奇遇。《天命奇御》具有多线剧情多结局,不限主线发展,高自由...
3. B站视频剪辑软件「必剪」:免费、炫酷特效,小白必备工具
B站视频剪辑软件「必剪」,完全免费、一键制作炫酷特效,适合新手小白。快来试试!
4. 手机游戏如何开发(如何制作传奇手游,都需要准备些什么?)
如何制作传奇手游,都需要准备些什么?提到传奇手游相信大家都不陌生,他是许多80、90后的回忆;从起初的端游到现在的手游,说明时代在进步游戏在更新,更趋于方便化移动化。而如果我们想要制作一款传奇手游的
5. 3D动画软件你知道几个?3ds Max、Blender、Maya、Houdini大比拼
当提到3D动画软件或动画工具时,指的是数字内容创建工具。它是用于造型、建模以及绘制3D美术动画的软件程序。但是,在3D动画软件中还包含了其他类型的...
三昧动漫对于著名ARPG游戏《巫师》系列,最近CD Projekt 的高层回应并不会推出《巫师4》。因为《巫师》系列在策划的时候一直定位在“三部曲”的故事框架,所以在游戏的出品上不可能出现《巫师4》
一、声音优化在绝地求生游戏中能够提前听到脚步声往往能提前取得战机,主要有两种方法:1、利用SoundLock软件,软件的功能主要是限制最大音量。百度搜索...
UI设计师、动画设计师、特效设计师每一个职位的功能和负责的方面都不同。所以,3D美术这方面需要大量的人才。但是要成为一个3D游戏建模师,也不是那么...
众所周知,虚幻引擎5(下面简称UE5)特别占用存储空间,仅一个版本安装好的文件就有60G,这还不包括我们在使用时保存的工程文件和随之产生的缓存文件。而...
想让你的3D打印模型更坚固?不妨尝试一下Cura参数设置和设计技巧,让你轻松掌握!
最新文章