kotlin在鸿蒙开发中的实践

news2024/11/15 8:15:51

先说一说kotlin

我们知道:

  1. kotlin目前是安卓首选的编程语言。

    安卓逐渐抛弃java,拥抱kotlin这是大的趋势。

  2. kotlin的最大优点就是与java的互操作性。

  3. kotlin编译的产物和java一样是bytecode(不抬杠,本文只说面向jvm的kotlin)。

  4. kotlin是一门现代高级语言。

    java也是高级语言,但开发效率很低。

    kotlin作为一门现代的语言,语法更简洁,而且具有很多高级特性,比如:Null Safe、Data Class、扩展、操作符重载、lambda表达式、闭包等

第一次尝试

我使用的鸿蒙ide是DevEco Studio 3.0.0.800。要使用kotlin,肯定要把相应的gradle插件、ide插件等配置上。

  1. gradle插件(作用:编译.kt文件) project的gradle.build中配置

    buildscript {
        dependencies {
         classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.10"
        }
    }

    entry的gradle.build中配置

    apply plugin: 'kotlin'
  2. ide插件(作用:让ide识别.kt文件、高亮显示、语法提示等)

    DevEco Studio 3.0.0.800是基于IntelliJ IDEA212.5457.46,所以我们找到相应的版本并下载https://plugins.jetbrains.com/plugin/6954-kotlin/versions/stable/150173

    把下载的zip包直接拖拽到DevEco界面上就会自动安装。 

  3. 建一个kotlin的Data Class, User

    data class User(val name: String, val age: Int)

    在MainAbilitySlice中使用User

    public class MainAbilitySlice extends AbilitySlice {
        @Override
        public void onStart(Intent intent) {
            super.onStart(intent);
            super.setUIContent(ResourceTable.Layout_ability_main);
            User andy = new User("andy", 28);//使用Data Class ,就像java的类一样
    
            Text text = (Text) findComponentById(ResourceTable.Id_text_helloworld);
            text.setText(andy.getName());
        }
    }
  4. 结果:

    能够识别.kt文件,并且语法高亮都没问题,说明ide插件配置成功。

    但是,编译失败,提示The 'java' plugin has been applied, but it is not compatible with the Hap plugins.。我的理解是,org.jetbrains.kotlin:kotlin-gradle-plugincom.huawei.ohos:hap冲突。这个问题,已经超出了我的能力范围。

    有没有别的办法呢?

第二次尝试

既然org.jetbrains.kotlin:kotlin-gradle-plugincom.huawei.ohos:hap冲突,我们再建一个java library的module,把.kt文件放在这个module下,是否可行呢?答案是:可行!

直接看源码吧----> HMkt: kotlin在鸿蒙开发中的实践

第三次尝试(kotlin代码中使用鸿蒙sdk中的类)

以自定义一个AlertDialog为例(参考https://gitee.com/chinasoft_ohos/HiPermission/blob/master/library/src/main/java/me/weyye/hipermission/AlertDialog.java)。纯java的代码使用kotlin来实现肯定是没问题的,如果依赖鸿蒙sdk的的类呢?比如`ohos.agp.window.dialog.CommonDialog`。

也很简单,直接把sdk中的ohos.jar(D:\Huawei\Sdk\java\3.0.0.0\api\ohos.jar)放在我的们MyJavaLib中,依赖这个类只是为了完成编译,不会打进最终的hap里。

但是编译过程生成的ResourceTable,我们只能以变通的方式来依赖了。以这个AlertDialog为例,布局文件的资源id就是一个int,其中的组件id也是int,因为id较多,我们封装到一个class ComponentId里。完整的代码如下:(把原java实现通过ide转成kotlin,然后简单修改。我对kotlin用得也不多,所以具体细节肯定有不符合kotlin的使用习惯。这篇文章的目的只是证明可行性,并给出执行方案)

package com.example.myjavalib
import ohos.agp.components.Component
import ohos.agp.components.LayoutScatter
import ohos.agp.components.Text
import ohos.agp.utils.LayoutAlignment
import ohos.agp.window.dialog.CommonDialog
import ohos.agp.window.dialog.IDialog
import ohos.app.Context
import ohos.multimodalinput.event.KeyEvent

/**
 * 自定义提示弹窗
 *
 * @since 2021-04-12
 * https://gitee.com/chinasoft_ohos/HiPermission/blob/master/library/src/main/java/me/weyye/hipermission/AlertDialog.java
 */
class AlertDialog(context: Context?, resId: Int, componentId: ComponentId) : CommonDialog(context) {
    private var tvTitle: Text? = null
    private var tvContent: Text? = null
    private var tvCancel: Text? = null
    private var tvSure: Text? = null

    data class ComponentId(val tvTitle: Int, val tvContent: Int, val tvCancel: Int, val tvSure: Int)


    init {
        setTransparent(true)
        setAlignment(LayoutAlignment.CENTER)
        val contentView = LayoutScatter.getInstance(context)
            .parse(resId, null, true)
        contentCustomComponent = contentView
        initView(componentId)
        siteRemovable(false)
        siteKeyboardCallback { iDialog: IDialog?, keyEvent: KeyEvent? -> true }
    }

    private fun initView(componentId: ComponentId) {
        val component = contentCustomComponent
        tvTitle = component.findComponentById<Component>(componentId.tvTitle) as Text
        tvContent = component.findComponentById<Component>(componentId.tvContent) as Text
        tvCancel = component.findComponentById<Component>(componentId.tvCancel) as Text
        tvSure = component.findComponentById<Component>(componentId.tvSure) as Text

        tvCancel!!.clickedListener = Component.ClickedListener { hide() }
        tvSure!!.clickedListener = Component.ClickedListener { hide() }
    }

    /**
     * 设置标题
     *
     * @param title 标题
     */
    fun setTitle(title: String?) {
        tvTitle!!.text = title
    }

    /**
     * 设置内容
     *
     * @param content 内容
     */
    fun setContent(content: String?) {
        tvContent!!.text = content
    }

    /**
     * 设置取消按钮文字和点击事件监听
     *
     * @param cancel 按钮文字
     * @param listener 点击事件监听
     */
    fun setCancel(cancel: String?, listener: Component.ClickedListener?) {
        tvCancel!!.text = cancel
        tvCancel!!.clickedListener = Component.ClickedListener {
            hide()
            listener?.onClick(tvCancel)
        }
    }

    /**
     * 设置确定按钮文字和点击事件监听
     *
     * @param sure 按钮文字
     * @param listener 点击事件监听
     */
    fun setSure(sure: String?, listener: Component.ClickedListener?) {
        tvSure!!.text = sure
        tvSure!!.clickedListener = Component.ClickedListener {
            hide()
            listener?.onClick(tvSure)
        }
    }
}

注意:我们依赖的ohos.jar要和entry编译用的api level保持一致。

总结

虽然,我们经过尝试,可以在鸿蒙app开发中使用kotlin,但是,我还是不建议在实际中大量使用。说不准哪一天,DevEco Studio 中完全不支持kotlin了,那样之前写的代码维护会不太方便。但是,如果有一些平台不相关的代码,比如,在android和鸿蒙上都会使用,那么我们完全可以放心使用kotlin来实现。 另外,在华为开发者大会上(2021-10-22),华为表示,将发布自研编程语言。我们就暂时忍受一下难用的java吧。华为的自研编程语言,在特性上肯定会和kotlin、swift之类的现代语言一样。现在学习使用kotlin对以后一定会有用的!

 

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

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

相关文章

Cadence基础操作:Schematic编辑

本文转载自B站up主:_WithB&#xff0c;原文链接如下&#xff1a;https://www.bilibili.com/read/cv20414466 鼠标 左键单击 –> 选中或确定操作 按住左键 –> 选中区域内所有组件 左键双击&#xff0c;可以选择以特定操作模式和窗口类型进入对应组件的下一层一般我是ed…

Winform从入门到精通(36)—ColorDialog(史上最全)更新中

前言 当我们需要设置某个控件的颜色时,并且需要弹出一个可以选择颜色的对话框时,这时候就需要使用ColorDialog 一、属性 1、AllowFullOpen 该属性用于启用或者禁用“自定义颜色按钮”,该属性为true时,可以自定义颜色 2、AnyColor 实际测试该属性没什么作用 3、Colo…

请求与相应

从容器到Servlet 前面我们介绍了JSP的内置对象和Servlet的相关知识&#xff0c; 以及如何部署和开发一个Servlet。但是&#xff0c; 并没有详细介绍如何将Servlet与JSP结合起来使用。Web容器是JSP唯一可以识别的HTTP服务器&#xff0c; 所以必须了解Web容器如何生成请求和响应…

来上海一个月的记录、思考和感悟

作者 | gongyouliu 编辑 | gongyouliu 从4月3号早上来上海&#xff0c;到今天差不多整整一个月了&#xff0c;也是自己正式从杭州离职创业&#xff08;我更愿意称之为自由职业者&#xff0c;毕竟我没有招聘全职员工&#xff0c;有两个朋友业余时间在帮我&#xff09;的第一个月…

SAP UI5 之Bootstrap(引导)笔记二

文章目录 Setting up Visual Studio Code for UI5 development1.0 官网 Walkthrough学习-Bootstrap 引导加载1.0.1 在 index.html中新增script标签1.0.2 在webapp 下面新增index.js文件1.0.3启动UI5的服务 Setting up Visual Studio Code for UI5 development 学习链接 Setti…

如何正确部署Redisearch和Rejson(附*.so文件免费下载)

1 缘起 项目需要。 最近的一个项目需要做文本搜索,技术选型:Redis的两个组件Redisearch和ReJSON。 Redisearch和ReJSON是Redis的两个组件: RediSearch为Redis提供查询、二次索引和全文搜索。使用RediSearch,首先要在Redis数据上声明索引。然后使用RediSearch查询语言来查…

【电子通识】颜色的困惑:什么是国际通用Panone(潘通)

Pantone 是世界知名的色彩权威机构&#xff0c;也是色彩系统的供应商&#xff0c;为许多行业提供专业色彩选择。在 Pantone 之前&#xff0c;每个印刷公司都有自己的色彩指南。比如都是“黄色”&#xff0c;但由于印刷方式有所不同&#xff08;具体取决于每个油墨公司如何解释该…

学习之-Mysql Sql 优化之 Explain

在开发中&#xff0c;往往遇到一些慢查询语句&#xff0c; 我们需要对慢查询进行优化。Explain工具就是用来分析某个慢查询执行情况的工具。通过在select 语句前加上explain 关键字&#xff0c;然后执行就会得到某个sql 执行计划信息&#xff0c;通过分析执行计划&#xff0c;我…

vue相关知识导学

学习资料 Vue 相关源码地址&#xff1a; vue2.0 GitHub - vuejs/vue: This is the repo for Vue 2. For Vue 3, go to https://github.com/vuejs/coreVue3.0 GitHub - vuejs/core: &#x1f596; Vue.js is a progressive, incrementally-adoptable JavaScri…

【从0到1了解Libarchive】Libarchive的用途意义以及成功入门Libarchive

目录 0 如果你还不知道Libarchive是什么请一定要先看一下 1 简介 1.1 为什么实现Libarchive 1.2 到底都有谁在用呢&#xff1f; 1.3 Libarchive都有哪些功能 1.4 我们可以通过这些获取更多信息 1.5 如何贡献 2 Libarchive归档与压缩 3 Libarchive编译 4 Libarchive简…

maven gpg报错:no default secret key: No secret key signing failed: No secret key

一、问题描述 我这边情况是这样的&#xff0c;原本在A电脑上&#xff0c;通过maven打包安装都是好的&#xff0c;最近新弄了台电脑&#xff0c;然后把A电脑的gpg秘钥通过Kleopatra的方式直接导出来 然后在B电脑上通过Kleopatra导入&#xff0c;整了很久&#xff0c;在IDEA中执…

FreeRTOS 事件标志组

文章目录 一、事件标志组简介二、创建事件标志组1. 函数 xEventGroupCreate()2. 函数 xEventGroupCreateStatic() 三、设置事件位1. 函数 xEventGroupClearBits()2. 函数 xEventGroupClearBitsFromISR()3. 函数 xEventGroupSetBits()4. 函数 xEventGroupSetBitsFromISR() 四、获…

Linux pthread线程操作 和 线程同步与互斥操作

在Linux系统中玩线程&#xff0c;使用pthread&#xff0c;这篇博客记录如何创建线程和使用线程和线程的同步与互斥。 还有一份nginx线程池的代码供大家阅读学习&#xff01; 目录 一、简介 什么是线程 线程的优点、缺点 线程的应用场合 二、线程的使用 1. 创建线程 - p…

如何评价聚类结果的好坏?

聚类有效性的评价可分为内部指标和外部指标&#xff0c;内部指标是一种无监督的评价方法&#xff0c;它对聚类结果的评价不需要借助样本集的真实标签&#xff0c;仅利用样本集自身 结构信息对聚类结果进行评价&#xff1b;而外部指标是一种有监督的评价方法&#xff0c;它通过对…

简单毛概刷题网页制作 3.0(拖欠近一年版)

原因是大概一年之前学校的毛概期末刷题网站突然崩了&#xff0c;但是一直没有修复。当时眼看着复习时间逐渐被压缩&#xff0c;自己啥也做不了&#xff0c;遂自学前端完成毛概刷题网页一枚。 最早的毛概刷题网站仅仅是 1.0 版本&#xff08;传送门&#xff09;&#xff0c;功能…

Microsoft office Word 批注相关问题解决

Microsoft office word 批注相关问题解决 目录 Microsoft office word 批注相关问题解决1.增添并显示批注2.批注显示及取消操作3.更改批注者姓名4.将Microsoft office Word文档中已批注的名字以及缩写修改为自己需要的4.1将Microsoft office Word文档中已批注的名字修改为自己需…

STM32开发(十八)STM32F103 片内资源 —— 窗口看门狗 WWDG 详解

文章目录 一、基础知识点二、开发环境三、STM32CubeMX相关配置四、Vscode代码讲解五、结果演示 一、基础知识点 独立看门狗和窗口看门狗的区别&#xff1a; 独立看门狗在系统在待机、停机、睡眠阶段还会起效果&#xff0c;这就会导致在做低功耗的时候&#xff0c;看门狗还是会…

Elasticsearch:定制 Elasticsearch 镜像

在很多时候&#xff0c;我们希望定制我们的 Elasticsearch 镜像&#xff0c;比如&#xff0c;我们需要安装一些额外的插件&#xff0c;或者如果我们想要一个带有同义词文件和自定义配置的 Elasticsearch&#xff1f;或者我们需要一些相应的配置等。我们想在每次的 docker 部署中…

华为实习笔试复盘(1)配送站和客户问题

写在前面 自己玩了很多项目&#xff0c;但是最近准备秋招的过程中&#xff0c;发现自己对于算法和编程语言的基本功夫实在是太欠缺了。 投递了华为的实习岗位&#xff0c;4.26参加机考&#xff0c;一做题就发现了自己很多地方都不会。这里写下笔试后的复盘以警醒自己。 题目 …

服务网关Gateway

前言 API 网关出现的原因是微服务架构的出现&#xff0c;不同的微服务一般会有不同的网络地址&#xff0c;而外部客户端可能需要调用多个服务的接口才能完成一个业务需求&#xff0c;如果让客户端直接与各个微服务通信&#xff0c;会有以下的问题&#xff1a; 破坏了服务无状态…