Kotlin Multiplatform项目探索之KMChat

这篇具有很好参考价值的文章主要介绍了Kotlin Multiplatform项目探索之KMChat。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Kotlin Multiplatform项目探索之KMChat

Kotlin Multiplatform项目探索之KMChat
这是当前在 Kotlin Multiplatform 官方文档中提议的用例结构。Kotlin Multiplatform 中包含的许多子组件已经发布了稳定版本,即使目前不稳定的组件也在迅速更新。

本文中的演示项目包括 Compose Multiplatform - Web (Experimental)、iOS (Alpha) 和 Kotlin Multiplatform - Kotlin/Native (Beta)。在进行产品项目开发时,使用这种方法可能会导致一些问题。

通用代码随处可见

在开发软件时,各个平台上都存在重复的实现,被称为通用代码。这项任务不仅需要开发成本,还包含了许多开销,比如通信成本。JetBrains 提议使用 Kotlin Multiplatform,可以将通用代码开发为单个代码库,有效地解决了这些问题。

KMChat

这是我实现的一个聊天应用项目,旨在更好地理解官方文档中提出的用例。通过这个项目,我将学习如何使用Kotlin Multiplatform编写通用代码,并将其应用于所有平台。

我还使用Compose Multiplatform实现了所有平台的用户界面。

预览结果

  • 创建房间 → 加入房间 → 设置用户名
    Kotlin Multiplatform项目探索之KMChat
    这是仅实现了聊天服务的最少功能的客户端的结果。您可以通过使用Compose多平台实现UI在所有平台上的结果。

Github

  • https://github.com/ColaGom/km-chat-common
  • https://github.com/ColaGom/km-chat-backend
  • https://github.com/ColaGom/km-chat-client

工程结构

Kotlin Multiplatform项目探索之KMChat
常用存储库由客户端和后端存储库中的子模块导入。

Common

  • 它包括聊天服务中使用的共同代码。
  • 我决定将演示项目的共同代码中包括DTO类和用例,这些类和用例同样包含在客户端和后端的业务逻辑中。

DTO

data class Chat
data class ChatMessage
data class ChatRoom
data class ChatUser

data class SendChat
data class CreateChatRoom
data class DeleteChatRoom

UseCase

interface UseCase<INPUT, OUTPUT> {
    suspend fun execute(input: INPUT): OUTPUT
}

interface CreateChatRoomUseCase : UseCase<CreateChatRoom, ChatRoom>
interface GetAllChatRoomUseCase : VoidUseCase<List<ChatRoom>>
interface GetChatRoomUseCase : UseCase<Long, ChatRoom?>

OverView common

Kotlin Multiplatform项目探索之KMChat
后端和客户端项目均使用UseCaseImpl实现业务逻辑。

后端 — ktor

  • 实现了聊天室和与用户相关的API功能。
  • 使用WebSocket实现了聊天功能。
  • 存储库采用内存方式实现存储所有数据。

客户端 — Compose Multiplatform

  • 支持AOS、iOS、Web和桌面平台。
  • 使用Kotlin Multiplatform实现了所有平台的客户端逻辑。
  • 使用Compose Multiplatform实现了所有平台的用户界面。

我尝试了两种使用Compose Multiplatform的方式。

  1. 使用Compose multiplatform实现整个屏幕 (Web, Desktop)。
//in shared common
@Composable
fun ChatApp() {
    var selectedRoom by remember {
        mutableStateOf<ChatRoom?>(null)
    }

    Theme {
        Surface {
            Column(modifier = Modifier.fillMaxSize()) {
                val room = selectedRoom
                if (room != null) {
                    ChatScreen(room.id)
                    DisposableEffect(room) {
                        onDispose {
                            selectedRoom = null
                        }
                    }
                } else {
                    ChatRoomListScreen {
                        selectedRoom = it
                    }
                }
            }
        }
    }
}
  1. 在本地 UI(AOS、iOS)中实现复合 UI。
class MainActivity : ComponentActivity() {
    private val chatLauncher = registerForActivityResult(ChatActivity.Contract()) { }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            ChatRoomListScreen(
                onClickRoom = { room ->
                    chatLauncher.launch(room.id)
                }
            )
        }
    }
}
@main
struct iOSApp: App {
    var body: some Scene {
        WindowGroup {
            MainView()
        }
    }
}

protocol ListViewListener : AnyObject {
    func clickRoom(room: Km_chat_commonChatRoom)
}

class MainViewModel: ObservableObject, ListViewListener {
    @Published var selectedRoom: Km_chat_commonChatRoom?
    
    var roomId: Int64 { ... }
    var entered: Bool { ... }
    
    func clickRoom(room: Km_chat_commonChatRoom) {
        selectedRoom = room
    }
}

struct MainView: View{
    @StateObject private var viewModel = MainViewModel()
    
    var body: some View {
        ListView(listener: viewModel)
            .sheet(isPresented: $viewModel.entered, content: { ChatView(roomId: viewModel.roomId) })
    }
}

struct ChatView: UIViewControllerRepresentable {
    var roomId: Int64
    
    func makeUIViewController(context: Context) -> UIViewController {
        return ControllersKt.ChatController(roomId: roomId)
    }
    
    func updateUIViewController(_ uiViewController: UIViewController, context: Context) {
    }
}

struct ListView: UIViewControllerRepresentable { ... }

结论

使用Kotlin Multiplatform似乎可以减少在各个层中存在的重复代码。

以下是将Kotlin Multiplatform应用于三层分层项目的两种方式的描述。

普通结构

Kotlin Multiplatform项目探索之KMChat
上图显示了一个典型工作客户端和后端的结构。我假设所有项目都是按照三层结构进行开发的。在整个层中常常存在大量重复的代码。

使用Compose多平台技术

Kotlin Multiplatform项目探索之KMChat
上图显示了KMChat的结构。我使用Kotlin多平台来共享通用代码,甚至为所有客户端实现用户界面。这种方法有潜力在某些平台(Web、iOS)上显著降低用户界面的质量,与本地(Native)相比。

共享演示业务,本地用户界面

Kotlin Multiplatform项目探索之KMChat
上图仅显示演示业务层作为共享模块实现,UI作为本地UI实现。它在保持本地UI开发优势的同时,减少了多个层次的代码重复。

共享业务逻辑及平台组件构建UI

Kotlin Multiplatform项目探索之KMChat
对于具有稳定性的平台,使用Compose实现UI,而其他平台使用本机UI。

参考

https://kotlinlang.org/lp/multiplatform/
https://kotlinlang.org/docs/multiplatform.html
https://www.jetbrains.com/lp/compose-multiplatform/文章来源地址https://www.toymoban.com/news/detail-511736.html

到了这里,关于Kotlin Multiplatform项目探索之KMChat的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Kotlin 1.9.0 发布:带来多项新特性,改进 Multiplatform/Native 支持

    Kotlin 的最新版本引入了许多新的语言特性,包括用于开放范围的…操作符、扩展正则表达式等。此外,它还改进了 Kotlin Multiplatform 和 Kotlin/Native 支持。 Kotlin 1.9 稳定了与枚举类关联的 entries 属性,它会返回所定义的枚举常量的所有值的列表。entries 弃用了 values(),它不再每次

    2024年02月14日
    浏览(37)
  • Kotlin & Compose Multiplatform 跨平台(Android端、桌面端)开发实践之使用 SQLDelight 将数据储存至数据库

    取标题的时候我还在想,我应该写 Compose 跨平台呢还是写 Kotlin 跨平台。 毕竟对于我的整体项目而言,确实是 Compose 跨平台开发,但是对于我这篇文章要说的东西,那其实也涉及不到多少 Compose 相关的内容,更多的应该是 Kotlin Multiplatform 相关的内容。 二者取舍不下,干脆都

    2024年02月15日
    浏览(46)
  • 【Kotlin】探索回调机制:函数类型、高阶函数和接口

    当在 Kotlin 中开发应用程序时,经常会遇到需要使用回调机制的情况。回调是一种常见的编程模式,用于在异步操作完成后通知调用方,并处理相应的结果或事件。在 Kotlin 中,有几种不同的方法可以实现回调,包括使用函数类型、高阶函数和接口。每种方法都有其优点和适用

    2024年02月02日
    浏览(48)
  • Kotlin对象和单例模式:探索这种强大设计模式的好处

    在Kotlin中,使用\\\"object\\\"来定义一个单例对象。所谓单例对象,就是在整个应用程序中只有一个实例存在。简单来说,就好像只有一个蜘蛛侠一样,不可能同时有多个蜘蛛侠存在(除非是在处理平行宇宙的故事情节,但那是另外一回事)。在Kotlin中,单例对象也是如此。

    2024年02月10日
    浏览(48)
  • 探索Kotlin K2编译器和Java编译器的功能和能力

    文章首发地址 Kotlin K2编译器是Kotlin语言的编译器,负责将Kotlin源代码转换为Java字节码或者其他目标平台的代码。K2编译器是Kotlin语言的核心组件之一,它的主要功能是将Kotlin代码编译为可在JVM上运行的字节码。 编译过程: Kotlin K2编译器将Kotlin源代码作为输入,并经过词法分

    2024年02月11日
    浏览(47)
  • 探索高级UI、源码解析与性能优化,了解开源框架及Flutter,助力Java和Kotlin筑基,揭秘NDK的魅力!

    链接: https://pan.baidu.com/s/13cR0Ip6lzgFoz0rcmgYGZA?pwd=y7hp 提取码: y7hp 复制这段内容后打开百度网盘手机App,操作更方便哦 --来自百度网盘超级会员v4的分享 📚【01】Java筑基:全方位指南带你从入门到进阶,打造坚实的Java基础!🔥 🔬【02】Kotlin:深入浅出,揭示Kotlin的奇妙之处,让

    2024年02月12日
    浏览(50)
  • kotlin项目引用

    概要:         记录项目引用kotlin具体事项 1 object下build.gradle 2 APP下build.gradle

    2024年04月14日
    浏览(25)
  • DB Change Manager Multiplatform Crack

    DB Change Manager/Data Compare now includes updated support for copying data when using Microsoft Azure SQL. DB Change Manager helps database administrators and developers simplify, automate, and report on database changes as well as streamline development cycles and ensure availability, performance and compliance. DB Change Manager’s compare, synchronizat

    2024年02月07日
    浏览(34)
  • 当我再次用Kotlin完成五年前已经通过Kotlin完成的项目后

      近日来对Kotlin的使用频率越来越高, 也对自己近年来写过的Kotlin代码尝试进行一个简单的整理. 翻到了自己五年前第一次使用Kotlin来完成的一个项目([贝塞尔曲线](https://juejin.cn/post/6844903556173004807)), 一时兴起, 又用发展到现在的Kotlin和Compose再次完成了这个项目. 也一遍来看看

    2024年02月03日
    浏览(38)
  • WebView交互架构项目实战(四),kotlin实战

    } 123456 然后我们注入js代码调用这个函数,并将121这个结果带回来来,在onPageFinished中调用以下代码 webView.evaluateJavascript(“getUID()”, new ValueCallback() { @Override public void onReceiveValue(String value) { Log.d(“CALLBACK”, value); } }); 123456 结果如下 JS调用Native JS调用Native是最常用也是最重要的

    2024年04月11日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包