【鸿蒙征文】UniApp(X) 让鸿蒙开发触手可及 —— LimeUI 组件库开发简录
引言:鸿蒙开发,真的有那么难吗?🤔
当鸿蒙系统(HarmonyOS)带着"分布式"、"原生智能"等前沿概念亮相时,许多开发者,尤其是前端开发者,心中难免产生畏惧:学习全新的 ArkTS 语言、掌握 DevEco Studio IDE、理解复杂的系统架构……这些障碍,似乎构筑了一道难以逾越的高墙。
然而,这种复杂的印象可能只是一种误解。如果你已经熟悉 Vue.js,那么惊喜来了——你与鸿蒙应用开发之间的距离,其实只隔了一个 UniApp(X)。本文将结合我开发 LimeUI 组件库的实战经历,向你证明:借助 UniApp(X),鸿蒙应用开发真的可以"有手就行",让前端开发者轻松拥抱鸿蒙生态。
第一章:UniApp(X) —— 鸿蒙开发的高效解决方案 🚀
在着手为鸿蒙生态贡献组件库时,作为一名熟悉UniApp的开发者,我自然选择了UniApp(X)。正是因为它会编译为ArkTS,能保持与原生相同的性能,同时极大地降低了开发门槛:
1. 零门槛的语法亲和性 ✨
对于Vue开发者而言,UniApp(X)的语法几乎是零学习成本的。你可以继续使用熟悉的template-script-style结构,继续运用v-model、v-if等指令。这种无缝衔接的体验,让鸿蒙开发的"陌生感"瞬间烟消云散。
2. 智能的平台差异抹平机制 🔄
UniApp(X) 的核心魅力在于其强大的条件编译系统。在开发 LimeUI 组件库时,我的代码结构通常是这样的:
<template>  
    <view class="l-button" @click="handleClick">  
      <text>{{ text }}</text>  
    </view>  
</template>  
<script setup lang="uts">  
  import { ButtonProps } from './type';  
  const emit = defineEmits(['click'])  
  const props = withDefaults(defineProps<ButtonProps>(), {  
    disabled: false,  
    ghost: false,  
    loading: false,  
    shape: 'rectangle',  
    size: 'medium',  
    type: 'default',  
})   
const handleClick = () => {  
    emit('click')  
    // #ifdef APP-HARMONY  
    // 鸿蒙平台特有的逻辑  
    console.log('Running on HarmonyOS!');  
    // #endif  
    // #ifdef MP-WEIXIN  
    // 微信小程序特有的逻辑  
    console.log('Running on WeChat!');  
    // #endif  
}  
</script>
通过简洁的#ifdef预处理指令,我能够轻松为不同平台(鸿蒙、微信小程序、iOS、Android等)编写差异化代码,同时保持核心业务逻辑的一致性。这种"一次开发,多端部署"的能力,让LimeUI组件库的开发效率得到了质的飞跃。
第二章:LimeUI 开发实战 —— 鸿蒙组件库的"简易模式" 🛠️
空谈理论不如实战演练。下面,我将以 LimeUI 中一个简单按钮组件的开发流程为例,带你体验这份"有手就行"的简单与高效。
步骤 1:环境搭建 —— 极简配置,快速上手 ⚡
环境配置非常简单直观,无需担心复杂的鸿蒙原生开发环境问题。按照官方教程完成几个基本步骤即可快速上手:运行和发行教程
步骤 2:组件开发 —— 用 Vue 的方式写鸿蒙组件 🎨
只需在创建 uni_modules 组件时选择相应的组件类型:
生成的uni_modules 组件目录结构如下:
├─pages  
│  └─index  
│     └─index.uvue  
└─uni_modules  
│  └─lime-button  
│     │─components  
│     │  └─lime-button  
│     │      └─lime-button.uvue  // 组件实现  
│     │      └─type.ts       // 类型定义
接下来,让我们开始开发 lime-button 组件:
<!-- lime-button.uvue -->  
<template>  
    <view class="l-button" @click="handleClick">  
      <text>{{ text }}</text>  
    </view>  
</template>  
<script setup lang="uts">  
  import { ButtonProps } from './type';  
  const emit = defineEmits(['click'])  
  const props = withDefaults(defineProps<ButtonProps>(), {  
    block: false,  
    disabled: false,  
    ghost: false,  
    loading: false,  
    shape: 'rectangle',  
    size: 'medium',  
    type: 'default',  
    hoverStopPropagation: false,  
    hoverStartTime: 20,  
    hoverStayTime: 70,  
    lang: 'en',  
    sessionFrom: '',  
    sendMessageTitle: '',  
    sendMessagePath: '',  
    sendMessageImg: '',  
    appParameter: '',  
    showMessageCard: false  
})   
const handleClick = () => {  
    emit('click')  
}  
</script>
看到了吗?这完全就是标准的Vue单文件组件!没有任何鸿蒙原生的特定语法。你已掌握的Vue知识,就是开发鸿蒙组件的全部技能储备。这种熟悉感,让开发者能够立即进入高效开发状态。
步骤 3:编译与预览 —— 所见即所得 👀
在HBuilderX中,只需在manifest.json中配置好鸿蒙应用信息,然后点击菜单栏的"运行 > 运行到手机或模拟器 > 运行到鸿蒙"。
接下来,UniApp(X) 编译器会自动将你编写的 .(u)vue 文件,编译转换为标准的鸿蒙原生工程和 ArkTS 代码。你无需关心底层复杂的转换过程,只需静待编译完成,就能在模拟器上看到组件完美运行。
这正是"有手就行"的最佳诠释。你只需用熟悉的语法表达业务逻辑,UniApp(X)则默默处理好所有平台适配的复杂工作。在将整个UI组件库适配到鸿蒙平台的过程中,我几乎没有遇到实质性的技术障碍,这也是UniApp(X)最大的魅力所在。
第三章:进阶挑战与解决方案 —— 当需要调用原生能力时 💪
当然,"有手就行"并不意味着毫无挑战。在开发LimeUI组件库的过程中,我也遇到过需要调用鸿蒙平台特有能力的场景。
挑战场景:我需要开发一个功能强大的lime-svg组件,它不仅要支持颜色修改,还要兼容多种加载方式(路径、base64、XML)。🎨
解决方案:UniApp(X)贴心地提供了native-view机制,让我们能够轻松调用鸿蒙原生能力。只需在创建uni_modules组件时选择"创建uts插件-标准组件":🔌
生成的uni_modules 组件目录结构如下:
├─pages  
│  └─index  
│     └─index.uvue  
└─uni_modules  
│  └─lime-svg  
│     │─components  
│     │  └─lime-svg  
│     │      └─lime-svg.uvue // 组件调用层  
│     └─utssdk  
│         └─app-harmony  
│             └─builder.ets  // 原生组件实现  
│             └─index.uts    // 桥接类导出
在组件调用层 lime-svg.uvue 中,我们这样编写:
<template>  
    <native-view class="l-svg" v-bind="$attrs" @init="onviewinit"></native-view>  
</template>  
<script setup lang="uts">  
import { SvpProps } from './type'  
import { NativeSvg } from "@/uni_modules/lime-svg"; // 导入桥接类  
let nativeSvg : NativeSvg | null = null  
const props = withDefaults(defineProps<SvpProps>(), {  
    src: '',  
    color: ''  
})  
const onviewinit = (e : UniNativeViewInitEvent) => {  
    nativeSvg = new NativeSvg(e.detail.element); // 传入native-view元素  
    nativeSvg?.updateSrc(props.src) // 调用实例方法更新资源  
    nativeSvg?.updateColor(props.color) // 调用实例方法更新颜色  
}  
</script>
在桥接类 index.uts 中,我们实现与原生能力的对接:
import { BuilderNode } from "@kit.ArkUI"  
import buffer from '@ohos.buffer';  
import { fileIo } from '@kit.CoreFileKit';  
// 导入混编实现的声明式UI构建函数  
import { buildSvg } from "./builder.ets"  
import { getEnv } from '@dcloudio/uni-runtime';  
export class NativeSvg {  
    private $element : UniNativeViewElement;  
    private builder : BuilderNode<[NativeSvgOptions]> | null = null  
    private svgMap : Map<string, string> = new Map<string, string>()  
    // 初始化 buildSvg 默认参数  
    private params : NativeSvgOptions = {  
        src: '',  
        onError: (message) => {  
            this.$element.dispatchEvent(new UniNativeViewEvent("error", { message }))  
        },  
        onComplete: (event : ESObject) => {  
            this.$element.dispatchEvent(new UniNativeViewEvent("load", {  
                width: event.width,  
                height: event.height  
            }))  
        },  
    }  
    constructor(element : UniNativeViewElement) {  
        // 绑定 wrapBuilder 函数  
        this.builder = element.bindHarmonyWrappedBuilder(wrapBuilder<[NativeSvgOptions]>(buildSvg), this.params)  
        this.$element = element  
        // 绑定当前实例为自定义的controller,方便其他地方通过 element 获取使用  
        this.$element.bindHarmonyController(this)  
    }  
    updateSrc(src : string) {  
        if (src.startsWith('data:image') || src.startsWith('<svg')) {  
            if (this.svgMap.has(src)) {  
                this.params.src = this.svgMap.get(src)!  
            } else {  
                // 处理临时文件路径  
                const tempFileName = `${Date.now()}.svg`  
                const tempDirPath = `${getEnv().TEMP_PATH}/svg`  
                const tempFilePath : string = `${tempDirPath}/${tempFileName}`  
                // 确保目录存在  
                if (!fileIo.accessSync(tempDirPath)) {  
                    fileIo.mkdirSync(tempDirPath, true)  
                }  
                // 创建并写入文件  
                const file = fileIo.openSync(tempFilePath, fileIo.OpenMode.CREATE | fileIo.OpenMode.READ_WRITE);  
                // 根据不同格式保存SVG内容  
                if (src.startsWith('<svg')) {  
                    fileIo.writeSync(file.fd, src); // 直接写入XML文本  
                }  
                // 获取资源文件的原生路径  
                const path = UTSHarmony.getResourcePath(tempFilePath)  
                this.svgMap.set(src, path) // 缓存已处理的资源  
                this.params.src = path  
            }  
        }  
        else {  
            // 处理普通资源路径  
            this.params.src = UTSHarmony.getResourcePath(src)  
        }  
        this.builder?.update(this.params) // 更新渲染  
    }  
    updateColor(color : string) {  
        this.params.color = color  
        this.builder?.update(this.params) // 更新渲染  
    }  
}
看到代码中我导入了一些原生库,有小伙伴可能会好奇这些库是如何知道的。实际上,通过查阅华为开发者文档,搜索"如何创建临时文件"等相关问题,华为的智能小助手就能直接提供相关代码参考。我们可以基于这些参考代码,根据实际需求进行适当修改和调整,轻松实现临时文件创建等功能。
(cv大师就是我)
最后,在原生渲染层 builder.ets 中,我们定义实际的渲染逻辑:
@Builder  
export function buildSvg(params: ESObject) {  
    Image(params.src)  
        .width('100%')  
        .height('100%')  
        .objectFit(ImageFit.Contain)  
        .fillColor(params.color) // 支持动态修改颜色  
        .onComplete((event)=>{  
            params.onComplete(event)  
        })  
        .onError((error) =>{  
            params.onError(error.message)  
        })  
}
通过这种方式,即使是需要调用鸿蒙特定功能,也能通过UniAppX的UTS标准组件机制轻松实现。这种优雅的桥接设计,让我们既能享受Vue开发的便捷,又能在需要原生能力的关键地方获得与原生开发完全一致的能力。而这只是UniApp(X)调用鸿蒙生态能力的一种方式,在下一章中,我们将探索如何通过UTS API灵活调用OpenHarmony三方库中心仓的第三方库和鸿蒙系统自带的原生库,实现更灵活的功能扩展。
第四章:进阶实战 —— 用UTS API调用OpenHarmony三方库中心仓的第三方库 🚀
如果说组件开发是"有手就行",那么直接调用OpenHarmony生态库就是"如虎添翼"。UniApp(X)提供的UTS(Uni TypeScript)能力,不但能调用鸿蒙系统自带的原生能力,还能加载(ohpm,类似npm的包管理平台)的第三方库,让我们可以在页面中轻松访问各种系统API和三方库功能,为LimeUI组件库的功能扩展提供了无限可能。
案例背景:lime-crypto加密库开发 🔐
在开发过程中,我需要一个强大的加密功能库。虽然在传统UniApp中可以使用crypto-js库,但在UniAppX中并不支持。因此,我决定通过UTS机制直接调用发布到OpenHarmony三方库中心仓的@ohos/crypto-js第三方库来实现加密功能。  
实现步骤:简单三步走 📋
只需在创建uni_modules组件时选择"创建uts插件-API插件":  
生成的uni_modules组件目录结构如下,与lime-svg类似,它也遵循了UniApp(X)的插件规范:
├─pages  
│  └─index  
│     └─index.uvue  
└─uni_modules  
│  └─lime-crypto  
│     └─utssdk  
│         └─app-harmony  
│             └─config.json // 原生依赖配置  
│             └─index.uts   // UTS桥接层实现
第一步:配置原生依赖 📦
在lime-crypto/utssdk/app-harmony/config.json中声明依赖:
{  
    "dependencies": {  
        "@ohos/crypto-js": "2.0.4"  
    }  
}
就是这么简单!UniApp(X)会自动处理依赖管理。
第二步:编写 UTS 桥接层 🌉
在lime-crypto/utssdk/app-harmony/index.uts中:
import { CryptoJS } from '@ohos/crypto-js'  
export class CryptoImpl {  
    constructor() {  
        // 初始化逻辑  
    }  
    // 获取编码器  
    get enc() {  
        return {  
            Utf8: CryptoJS.enc.Utf8,  
            Hex: CryptoJS.enc.Hex,  
            Base64: CryptoJS.enc.Base64,  
            // ... 其他编码器  
        }   
    }  
    // 加密算法  
    get AES() : CryptoJS.CipherHelper {  
        return CryptoJS.AES  
    }  
    get DES(): CryptoJS.CipherHelper {  
        return CryptoJS.DES  
    }  
    // 哈希函数  
    MD5(message: string) {  
        return CryptoJS.MD5(message)  
    }  
    SHA256(message: string) {  
        return CryptoJS.SHA256(message)  
    }  
    // HMAC 签名  
    HmacSHA256(message: string, secretKey: string) {  
        return CryptoJS.HmacSHA256(message, secretKey)  
    }  
}  
export function useCrypto() {  
    return new CryptoImpl()  
}
有细心的小伙伴可能会发现,为何我要封装一个CryptoImpl类,直接导出CryptoJS不香吗?实际上,虽然直接导出CryptoJS是可行的,但封装一个专门的实现类可以更好地控制API暴露范围,提供更符合业务需求的接口,并为后续可能的功能扩展和维护提供便利(借口,凑字数而已)。
export function useCrypto() {  
    return CryptoJS //全网最简单的加密库实现(搬运工的日常)  
}
第三步:在Vue组件中使用 🎯
现在,我们可以在普通的 Vue 组件中直接使用这个原生加密库了:
<template>  
    <view class="demo-container">  
        <lime-button @click="encryptData">加密测试</lime-button>  
        <text>{{ encryptedText }}</text>  
    </view>  
</template>  
<script setup lang="uts">  
import { useCrypto } from '@/uni_modules/lime-crypto'  
const crypto = useCrypto()  
const encryptedText = ref('')  
const encryptData = () => {  
    // 使用鸿蒙原生加密库进行 AES 加密  
    const encrypted = crypto.AES.encrypt(  
        'Hello HarmonyOS',   
        'secret-key-12345',   
        {   
            mode: crypto.mode.CBC,  
            padding: crypto.pad.Pkcs7   
        }  
    )  
    encryptedText.value = encrypted.toString()  
    console.log('加密结果:', encryptedText.value)  
    // 使用 SHA256 哈希  
    const hash = crypto.SHA256('需要哈希的数据')  
    console.log('SHA256 结果:', hash.toString())  
}  
</script>
通过lime-crypto的实现,我们可以看到UniApp(X)的UTS能力真正实现了:"用前端熟悉的语法,调用原生API的便利"。就这?就这么简单!我上我也行了!成为鸿蒙开发大佬,从此走向人生的鼎峰!
开发者既能利用Vue框架的开发便捷性快速构建UI界面,又能在需要原生能力的关键地方直接调用鸿蒙原生API。这种灵活的技术架构,为鸿蒙应用开发提供了高效且强大的解决方案。
不过,当前的开发体验仍有一些可以改进的空间:ArkTS引擎在代码修改后需要重新构建、签名和安装,这增加了开发过程中的等待时间;另外,首次编译所需的时间相对较长。希望未来的版本能够优化这些方面,进一步提升开发效率。
结语:鸿蒙开发,触手可及 🌈
通过LimeUI组件库的开发实践,我深刻体会到:UniApp(X)极大地降低了鸿蒙应用开发的技术门槛。作为开发者,你完全可以利用已掌握的Vue技术栈,以熟悉的开发方式快速进入鸿蒙开发领域。
鸿蒙生态正处于高速发展阶段,对于开发者而言,这是一片充满机遇的蓝海。UniApp(X)作为连接Vue技术栈与鸿蒙生态的桥梁,为开发者提供了一条低门槛、高效率的技术路径。
对于正在观望鸿蒙开发的开发者来说,现在正是借助UniApp(X)进入鸿蒙生态的理想时机。带着你熟悉的技术积累,你会发现鸿蒙开发并非想象中那样困难,而是可以通过现有技能平稳过渡的技术领域。
毕竟,能用熟悉的技术拥抱未来,这本身就是一件超酷的事,不是吗?💻✨
正是借助UniApp(X)的强大生态与开发便利性,我开发的LimeUI组件库中每个组件都作为独立插件上传到UniApp市场,目前已成功开源发布超过100款组件插件,为开发者社区贡献自己的一份力量!🚀
LimeUI组件库还同时支持UniApp和UniAppX双框架,让开发者可以在两个技术栈中无缝使用同一套组件,极大地提升了开发效率和代码复用性!
如果您在使用过程中发现组件库有任何不完善或缺少的组件,请随时在插件市场留言您的需求和建议。每一条反馈都是促使LimeUI不断完善的宝贵动力,我会认真对待并持续优化组件库,为开发者提供更好的使用体验!
如果您觉得我写的内容对您有所帮助,欢迎点赞加关注,一键三连支持!我第一次写文章,如果有不足之处,还请各位轻喷,我会不断学习和进步!
欢迎访问我的插件市场主页:https://ext.dcloud.net.cn/publisher?id=242774。
引言:鸿蒙开发,真的有那么难吗?🤔
当鸿蒙系统(HarmonyOS)带着"分布式"、"原生智能"等前沿概念亮相时,许多开发者,尤其是前端开发者,心中难免产生畏惧:学习全新的 ArkTS 语言、掌握 DevEco Studio IDE、理解复杂的系统架构……这些障碍,似乎构筑了一道难以逾越的高墙。
然而,这种复杂的印象可能只是一种误解。如果你已经熟悉 Vue.js,那么惊喜来了——你与鸿蒙应用开发之间的距离,其实只隔了一个 UniApp(X)。本文将结合我开发 LimeUI 组件库的实战经历,向你证明:借助 UniApp(X),鸿蒙应用开发真的可以"有手就行",让前端开发者轻松拥抱鸿蒙生态。
第一章:UniApp(X) —— 鸿蒙开发的高效解决方案 🚀
在着手为鸿蒙生态贡献组件库时,作为一名熟悉UniApp的开发者,我自然选择了UniApp(X)。正是因为它会编译为ArkTS,能保持与原生相同的性能,同时极大地降低了开发门槛:
1. 零门槛的语法亲和性 ✨
对于Vue开发者而言,UniApp(X)的语法几乎是零学习成本的。你可以继续使用熟悉的template-script-style结构,继续运用v-model、v-if等指令。这种无缝衔接的体验,让鸿蒙开发的"陌生感"瞬间烟消云散。
2. 智能的平台差异抹平机制 🔄
UniApp(X) 的核心魅力在于其强大的条件编译系统。在开发 LimeUI 组件库时,我的代码结构通常是这样的:
<template>  
    <view class="l-button" @click="handleClick">  
      <text>{{ text }}</text>  
    </view>  
</template>  
<script setup lang="uts">  
  import { ButtonProps } from './type';  
  const emit = defineEmits(['click'])  
  const props = withDefaults(defineProps<ButtonProps>(), {  
    disabled: false,  
    ghost: false,  
    loading: false,  
    shape: 'rectangle',  
    size: 'medium',  
    type: 'default',  
})   
const handleClick = () => {  
    emit('click')  
    // #ifdef APP-HARMONY  
    // 鸿蒙平台特有的逻辑  
    console.log('Running on HarmonyOS!');  
    // #endif  
    // #ifdef MP-WEIXIN  
    // 微信小程序特有的逻辑  
    console.log('Running on WeChat!');  
    // #endif  
}  
</script>
通过简洁的#ifdef预处理指令,我能够轻松为不同平台(鸿蒙、微信小程序、iOS、Android等)编写差异化代码,同时保持核心业务逻辑的一致性。这种"一次开发,多端部署"的能力,让LimeUI组件库的开发效率得到了质的飞跃。
第二章:LimeUI 开发实战 —— 鸿蒙组件库的"简易模式" 🛠️
空谈理论不如实战演练。下面,我将以 LimeUI 中一个简单按钮组件的开发流程为例,带你体验这份"有手就行"的简单与高效。
步骤 1:环境搭建 —— 极简配置,快速上手 ⚡
环境配置非常简单直观,无需担心复杂的鸿蒙原生开发环境问题。按照官方教程完成几个基本步骤即可快速上手:运行和发行教程
步骤 2:组件开发 —— 用 Vue 的方式写鸿蒙组件 🎨
只需在创建 uni_modules 组件时选择相应的组件类型:
生成的uni_modules 组件目录结构如下:
├─pages  
│  └─index  
│     └─index.uvue  
└─uni_modules  
│  └─lime-button  
│     │─components  
│     │  └─lime-button  
│     │      └─lime-button.uvue  // 组件实现  
│     │      └─type.ts       // 类型定义
接下来,让我们开始开发 lime-button 组件:
<!-- lime-button.uvue -->  
<template>  
    <view class="l-button" @click="handleClick">  
      <text>{{ text }}</text>  
    </view>  
</template>  
<script setup lang="uts">  
  import { ButtonProps } from './type';  
  const emit = defineEmits(['click'])  
  const props = withDefaults(defineProps<ButtonProps>(), {  
    block: false,  
    disabled: false,  
    ghost: false,  
    loading: false,  
    shape: 'rectangle',  
    size: 'medium',  
    type: 'default',  
    hoverStopPropagation: false,  
    hoverStartTime: 20,  
    hoverStayTime: 70,  
    lang: 'en',  
    sessionFrom: '',  
    sendMessageTitle: '',  
    sendMessagePath: '',  
    sendMessageImg: '',  
    appParameter: '',  
    showMessageCard: false  
})   
const handleClick = () => {  
    emit('click')  
}  
</script>
看到了吗?这完全就是标准的Vue单文件组件!没有任何鸿蒙原生的特定语法。你已掌握的Vue知识,就是开发鸿蒙组件的全部技能储备。这种熟悉感,让开发者能够立即进入高效开发状态。
步骤 3:编译与预览 —— 所见即所得 👀
在HBuilderX中,只需在manifest.json中配置好鸿蒙应用信息,然后点击菜单栏的"运行 > 运行到手机或模拟器 > 运行到鸿蒙"。
接下来,UniApp(X) 编译器会自动将你编写的 .(u)vue 文件,编译转换为标准的鸿蒙原生工程和 ArkTS 代码。你无需关心底层复杂的转换过程,只需静待编译完成,就能在模拟器上看到组件完美运行。
这正是"有手就行"的最佳诠释。你只需用熟悉的语法表达业务逻辑,UniApp(X)则默默处理好所有平台适配的复杂工作。在将整个UI组件库适配到鸿蒙平台的过程中,我几乎没有遇到实质性的技术障碍,这也是UniApp(X)最大的魅力所在。
第三章:进阶挑战与解决方案 —— 当需要调用原生能力时 💪
当然,"有手就行"并不意味着毫无挑战。在开发LimeUI组件库的过程中,我也遇到过需要调用鸿蒙平台特有能力的场景。
挑战场景:我需要开发一个功能强大的lime-svg组件,它不仅要支持颜色修改,还要兼容多种加载方式(路径、base64、XML)。🎨
解决方案:UniApp(X)贴心地提供了native-view机制,让我们能够轻松调用鸿蒙原生能力。只需在创建uni_modules组件时选择"创建uts插件-标准组件":🔌
生成的uni_modules 组件目录结构如下:
├─pages  
│  └─index  
│     └─index.uvue  
└─uni_modules  
│  └─lime-svg  
│     │─components  
│     │  └─lime-svg  
│     │      └─lime-svg.uvue // 组件调用层  
│     └─utssdk  
│         └─app-harmony  
│             └─builder.ets  // 原生组件实现  
│             └─index.uts    // 桥接类导出
在组件调用层 lime-svg.uvue 中,我们这样编写:
<template>  
    <native-view class="l-svg" v-bind="$attrs" @init="onviewinit"></native-view>  
</template>  
<script setup lang="uts">  
import { SvpProps } from './type'  
import { NativeSvg } from "@/uni_modules/lime-svg"; // 导入桥接类  
let nativeSvg : NativeSvg | null = null  
const props = withDefaults(defineProps<SvpProps>(), {  
    src: '',  
    color: ''  
})  
const onviewinit = (e : UniNativeViewInitEvent) => {  
    nativeSvg = new NativeSvg(e.detail.element); // 传入native-view元素  
    nativeSvg?.updateSrc(props.src) // 调用实例方法更新资源  
    nativeSvg?.updateColor(props.color) // 调用实例方法更新颜色  
}  
</script>
在桥接类 index.uts 中,我们实现与原生能力的对接:
import { BuilderNode } from "@kit.ArkUI"  
import buffer from '@ohos.buffer';  
import { fileIo } from '@kit.CoreFileKit';  
// 导入混编实现的声明式UI构建函数  
import { buildSvg } from "./builder.ets"  
import { getEnv } from '@dcloudio/uni-runtime';  
export class NativeSvg {  
    private $element : UniNativeViewElement;  
    private builder : BuilderNode<[NativeSvgOptions]> | null = null  
    private svgMap : Map<string, string> = new Map<string, string>()  
    // 初始化 buildSvg 默认参数  
    private params : NativeSvgOptions = {  
        src: '',  
        onError: (message) => {  
            this.$element.dispatchEvent(new UniNativeViewEvent("error", { message }))  
        },  
        onComplete: (event : ESObject) => {  
            this.$element.dispatchEvent(new UniNativeViewEvent("load", {  
                width: event.width,  
                height: event.height  
            }))  
        },  
    }  
    constructor(element : UniNativeViewElement) {  
        // 绑定 wrapBuilder 函数  
        this.builder = element.bindHarmonyWrappedBuilder(wrapBuilder<[NativeSvgOptions]>(buildSvg), this.params)  
        this.$element = element  
        // 绑定当前实例为自定义的controller,方便其他地方通过 element 获取使用  
        this.$element.bindHarmonyController(this)  
    }  
    updateSrc(src : string) {  
        if (src.startsWith('data:image') || src.startsWith('<svg')) {  
            if (this.svgMap.has(src)) {  
                this.params.src = this.svgMap.get(src)!  
            } else {  
                // 处理临时文件路径  
                const tempFileName = `${Date.now()}.svg`  
                const tempDirPath = `${getEnv().TEMP_PATH}/svg`  
                const tempFilePath : string = `${tempDirPath}/${tempFileName}`  
                // 确保目录存在  
                if (!fileIo.accessSync(tempDirPath)) {  
                    fileIo.mkdirSync(tempDirPath, true)  
                }  
                // 创建并写入文件  
                const file = fileIo.openSync(tempFilePath, fileIo.OpenMode.CREATE | fileIo.OpenMode.READ_WRITE);  
                // 根据不同格式保存SVG内容  
                if (src.startsWith('<svg')) {  
                    fileIo.writeSync(file.fd, src); // 直接写入XML文本  
                }  
                // 获取资源文件的原生路径  
                const path = UTSHarmony.getResourcePath(tempFilePath)  
                this.svgMap.set(src, path) // 缓存已处理的资源  
                this.params.src = path  
            }  
        }  
        else {  
            // 处理普通资源路径  
            this.params.src = UTSHarmony.getResourcePath(src)  
        }  
        this.builder?.update(this.params) // 更新渲染  
    }  
    updateColor(color : string) {  
        this.params.color = color  
        this.builder?.update(this.params) // 更新渲染  
    }  
}
看到代码中我导入了一些原生库,有小伙伴可能会好奇这些库是如何知道的。实际上,通过查阅华为开发者文档,搜索"如何创建临时文件"等相关问题,华为的智能小助手就能直接提供相关代码参考。我们可以基于这些参考代码,根据实际需求进行适当修改和调整,轻松实现临时文件创建等功能。
(cv大师就是我)
最后,在原生渲染层 builder.ets 中,我们定义实际的渲染逻辑:
@Builder  
export function buildSvg(params: ESObject) {  
    Image(params.src)  
        .width('100%')  
        .height('100%')  
        .objectFit(ImageFit.Contain)  
        .fillColor(params.color) // 支持动态修改颜色  
        .onComplete((event)=>{  
            params.onComplete(event)  
        })  
        .onError((error) =>{  
            params.onError(error.message)  
        })  
}
通过这种方式,即使是需要调用鸿蒙特定功能,也能通过UniAppX的UTS标准组件机制轻松实现。这种优雅的桥接设计,让我们既能享受Vue开发的便捷,又能在需要原生能力的关键地方获得与原生开发完全一致的能力。而这只是UniApp(X)调用鸿蒙生态能力的一种方式,在下一章中,我们将探索如何通过UTS API灵活调用OpenHarmony三方库中心仓的第三方库和鸿蒙系统自带的原生库,实现更灵活的功能扩展。
第四章:进阶实战 —— 用UTS API调用OpenHarmony三方库中心仓的第三方库 🚀
如果说组件开发是"有手就行",那么直接调用OpenHarmony生态库就是"如虎添翼"。UniApp(X)提供的UTS(Uni TypeScript)能力,不但能调用鸿蒙系统自带的原生能力,还能加载(ohpm,类似npm的包管理平台)的第三方库,让我们可以在页面中轻松访问各种系统API和三方库功能,为LimeUI组件库的功能扩展提供了无限可能。
案例背景:lime-crypto加密库开发 🔐
在开发过程中,我需要一个强大的加密功能库。虽然在传统UniApp中可以使用crypto-js库,但在UniAppX中并不支持。因此,我决定通过UTS机制直接调用发布到OpenHarmony三方库中心仓的@ohos/crypto-js第三方库来实现加密功能。  
实现步骤:简单三步走 📋
只需在创建uni_modules组件时选择"创建uts插件-API插件":  
生成的uni_modules组件目录结构如下,与lime-svg类似,它也遵循了UniApp(X)的插件规范:
├─pages  
│  └─index  
│     └─index.uvue  
└─uni_modules  
│  └─lime-crypto  
│     └─utssdk  
│         └─app-harmony  
│             └─config.json // 原生依赖配置  
│             └─index.uts   // UTS桥接层实现
第一步:配置原生依赖 📦
在lime-crypto/utssdk/app-harmony/config.json中声明依赖:
{  
    "dependencies": {  
        "@ohos/crypto-js": "2.0.4"  
    }  
}
就是这么简单!UniApp(X)会自动处理依赖管理。
第二步:编写 UTS 桥接层 🌉
在lime-crypto/utssdk/app-harmony/index.uts中:
import { CryptoJS } from '@ohos/crypto-js'  
export class CryptoImpl {  
    constructor() {  
        // 初始化逻辑  
    }  
    // 获取编码器  
    get enc() {  
        return {  
            Utf8: CryptoJS.enc.Utf8,  
            Hex: CryptoJS.enc.Hex,  
            Base64: CryptoJS.enc.Base64,  
            // ... 其他编码器  
        }   
    }  
    // 加密算法  
    get AES() : CryptoJS.CipherHelper {  
        return CryptoJS.AES  
    }  
    get DES(): CryptoJS.CipherHelper {  
        return CryptoJS.DES  
    }  
    // 哈希函数  
    MD5(message: string) {  
        return CryptoJS.MD5(message)  
    }  
    SHA256(message: string) {  
        return CryptoJS.SHA256(message)  
    }  
    // HMAC 签名  
    HmacSHA256(message: string, secretKey: string) {  
        return CryptoJS.HmacSHA256(message, secretKey)  
    }  
}  
export function useCrypto() {  
    return new CryptoImpl()  
}
有细心的小伙伴可能会发现,为何我要封装一个CryptoImpl类,直接导出CryptoJS不香吗?实际上,虽然直接导出CryptoJS是可行的,但封装一个专门的实现类可以更好地控制API暴露范围,提供更符合业务需求的接口,并为后续可能的功能扩展和维护提供便利(借口,凑字数而已)。
export function useCrypto() {  
    return CryptoJS //全网最简单的加密库实现(搬运工的日常)  
}
第三步:在Vue组件中使用 🎯
现在,我们可以在普通的 Vue 组件中直接使用这个原生加密库了:
<template>  
    <view class="demo-container">  
        <lime-button @click="encryptData">加密测试</lime-button>  
        <text>{{ encryptedText }}</text>  
    </view>  
</template>  
<script setup lang="uts">  
import { useCrypto } from '@/uni_modules/lime-crypto'  
const crypto = useCrypto()  
const encryptedText = ref('')  
const encryptData = () => {  
    // 使用鸿蒙原生加密库进行 AES 加密  
    const encrypted = crypto.AES.encrypt(  
        'Hello HarmonyOS',   
        'secret-key-12345',   
        {   
            mode: crypto.mode.CBC,  
            padding: crypto.pad.Pkcs7   
        }  
    )  
    encryptedText.value = encrypted.toString()  
    console.log('加密结果:', encryptedText.value)  
    // 使用 SHA256 哈希  
    const hash = crypto.SHA256('需要哈希的数据')  
    console.log('SHA256 结果:', hash.toString())  
}  
</script>
通过lime-crypto的实现,我们可以看到UniApp(X)的UTS能力真正实现了:"用前端熟悉的语法,调用原生API的便利"。就这?就这么简单!我上我也行了!成为鸿蒙开发大佬,从此走向人生的鼎峰!
开发者既能利用Vue框架的开发便捷性快速构建UI界面,又能在需要原生能力的关键地方直接调用鸿蒙原生API。这种灵活的技术架构,为鸿蒙应用开发提供了高效且强大的解决方案。
不过,当前的开发体验仍有一些可以改进的空间:ArkTS引擎在代码修改后需要重新构建、签名和安装,这增加了开发过程中的等待时间;另外,首次编译所需的时间相对较长。希望未来的版本能够优化这些方面,进一步提升开发效率。
结语:鸿蒙开发,触手可及 🌈
通过LimeUI组件库的开发实践,我深刻体会到:UniApp(X)极大地降低了鸿蒙应用开发的技术门槛。作为开发者,你完全可以利用已掌握的Vue技术栈,以熟悉的开发方式快速进入鸿蒙开发领域。
鸿蒙生态正处于高速发展阶段,对于开发者而言,这是一片充满机遇的蓝海。UniApp(X)作为连接Vue技术栈与鸿蒙生态的桥梁,为开发者提供了一条低门槛、高效率的技术路径。
对于正在观望鸿蒙开发的开发者来说,现在正是借助UniApp(X)进入鸿蒙生态的理想时机。带着你熟悉的技术积累,你会发现鸿蒙开发并非想象中那样困难,而是可以通过现有技能平稳过渡的技术领域。
毕竟,能用熟悉的技术拥抱未来,这本身就是一件超酷的事,不是吗?💻✨
正是借助UniApp(X)的强大生态与开发便利性,我开发的LimeUI组件库中每个组件都作为独立插件上传到UniApp市场,目前已成功开源发布超过100款组件插件,为开发者社区贡献自己的一份力量!🚀
LimeUI组件库还同时支持UniApp和UniAppX双框架,让开发者可以在两个技术栈中无缝使用同一套组件,极大地提升了开发效率和代码复用性!
如果您在使用过程中发现组件库有任何不完善或缺少的组件,请随时在插件市场留言您的需求和建议。每一条反馈都是促使LimeUI不断完善的宝贵动力,我会认真对待并持续优化组件库,为开发者提供更好的使用体验!
如果您觉得我写的内容对您有所帮助,欢迎点赞加关注,一键三连支持!我第一次写文章,如果有不足之处,还请各位轻喷,我会不断学习和进步!
欢迎访问我的插件市场主页:https://ext.dcloud.net.cn/publisher?id=242774。
收起阅读 »uniappx插件nutpi-idcard 开发与使用指南(适配鸿蒙)
uniappx插件nutpi-idcard 开发与使用指南(适配鸿蒙)
前言
nutpi-idcard 是一个基于 UTS (uni-app TypeScript Syntax) 开发的 uni-app 插件适配鸿蒙,主要用于解析身份证号码,提取其中的关键信息,如地区、出生日期、性别等。本插件支持中国居民身份证、港澳台居民居住证以及外国人永久居留身份证。  
本文将详细介绍 nutpi-idcard 插件的开发过程和使用方法,希望能为其他开发者提供一些参考。  
插件功能
- 身份证号码解析:能够从身份证号码中提取省市区(或国家/地区)、出生日期、性别等信息。
 - 支持多种证件类型:  
- 中国居民身份证
 - 港澳台居民居住证
 - 外国人永久居留身份证
 
 - 纯 UTS 实现:确保了插件在 uni-app x 及其他支持 UTS 的环境中的兼容性和性能。
 - 跨平台支持:理论上支持所有 uni-app 支持的平台,特别是针对 App (Android, iOS, HarmonyOS) 进行了适配。
 
开发过程
1. 项目初始化与环境搭建
插件的开发基于 HBuilderX,利用其对 uni-app 和 UTS 的良好支持。
- 创建 uni-app 项目:首先,创建一个标准的 uni-app 项目(如果还没有的话)。
 - 创建 uni_module:在项目根目录下创建 
uni_modules文件夹(如果不存在),然后在其中创建nutpi-idcard文件夹作为插件的根目录。 - 配置文件 
package.json:在nutpi-idcard目录下创建package.json文件,用于定义插件的基本信息、依赖、平台支持等。关键配置项包括:id: 插件的唯一标识。displayName: 插件在 HBuilderX 中显示的名称。version: 插件版本号。description: 插件描述。author: 作者信息-坚果派。contact: 联系方式。repository: 代码仓库地址。engines: HBuilderX 版本要求。dcloudext: DCloud 扩展配置,如插件类型 (uts)、销售信息等。uni_modules: uni-app 模块配置,如依赖、加密、平台支持等。
 
2. 核心逻辑实现 (utssdk)
插件的核心代码位于 utssdk 目录下,针对不同平台可以有不同的实现,但本项目中主要关注通用的 UTS 实现,特别是针对 HarmonyOS 的适配。  
- 
目录结构:
nutpi-idcard/ ├── utssdk/ │ ├── app-harmony/ # HarmonyOS 平台特定代码 │ │ ├── index.uts # HarmonyOS 入口及核心逻辑 │ │ ├── interfaces.uts # TypeScript 接口定义 │ │ └── module/ │ │ └── data/ # 数据文件 (行政区划、国家代码) │ │ ├── china.uts │ │ └── international.uts │ ├── app-android/ # Android 平台 (如果需要特定实现) │ ├── app-ios/ # iOS 平台 (如果需要特定实现) │ ├── index.uts # 插件主入口 (通常导出各平台实现) │ └── interfaces.uts # 通用接口定义 ├── package.json ├── readme.md └── changelog.md - 
数据准备 (
module/data/):china.uts: 存储中国行政区划代码与名称的映射。international.uts: 存储 ISO 3166-1 国家代码与名称的映射。
 - 
接口定义 (
interfaces.uts):
定义了身份证解析结果的数据结构IDResult。export interface IDResult { type?: string; // 证件类型 sign?: string; // 签发机关或地区 country?: string; // 国家或地区 birthday?: string; // 出生日期 (YYYY-MM-DD) sex?: string; // 性别 ('男' 或 '女') isValid?: boolean; // 校验结果 (当前版本简单返回 true) } - 
核心解析逻辑 (
app-harmony/index.uts):
这是插件的核心,包含了主要的解析函数。parseID(id: string): IDResult: 公开的 API 函数,根据身份证号码的格式(通过正则表达式判断)调用相应的内部解析函数。parserChina(id: string): IDResult: 解析中国居民身份证和港澳台居民居住证。- 通过身份证号码的前6位确定省市区。
 - 通过第7到14位确定出生日期。
 - 通过第17位(顺序码的最后一位)确定性别。
 parserInternational(id: string): IDResult: 解析外国人永久居留身份证。- 通过第1到3位(国家或地区代码)和 
international.uts数据确定国家。 - 通过第7到14位确定出生日期。
 - 通过第17位确定性别。
 isIdCardValidInternal(id: string): boolean: 身份证号码有效性校验函数。目前简单返回true,未来可以根据国家标准实现更复杂的校验逻辑(如校验码计算)。
// idcard/uni_modules/nutpi-idcard/utssdk/app-harmony/index.uts import { chinaData as _china } from './module/data/china.uts'; import { internationalData as _international } from './module/data/international.uts'; import type { IDResult } from './interfaces.uts'; function parserInternational(id: string): IDResult { /* ... */ } function parserChina(id: string): IDResult { /* ... */ } function isIdCardValidInternal(id: string): boolean { /* ... */ } export function parseID(id: string): IDResult { if(id.match(/^9\d{16}[0-9xX]$/)){ // 外国人永久居留身份证特征 (假设以9开头) return parserInternational(id); }else if(id.match(/^\d{17}[0-9xX]$/)){ // 中国居民身份证特征 return parserChina(id); }else{ return { type: '未知类型' }; } } 
3. 插件入口 (index.uts)
在 nutpi-idcard 根目录下的 index.uts 文件通常作为插件的统一入口,它会根据当前运行平台导出相应平台的 parseID 函数。  
// idcard/uni_modules/nutpi-idcard/index.uts  
// #ifdef APP-HARMONY  
export * from './utssdk/app-harmony/index.uts';  
// #endif  
// #ifdef APP-PLUS || APP-VUE  
// 假设 Android 和 iOS 使用相同的 UTS 逻辑,或者有单独的 app-android/index.uts 和 app-ios/index.uts  
// 如果 utssdk/index.uts 包含了 Android 和 iOS 的通用逻辑,可以这样导出:  
// export * from './utssdk/index.uts';   
// 或者分别导出  
// #ifdef APP-ANDROID  
// export * from './utssdk/app-android/index.uts';  
// #endif  
// #ifdef APP-IOS  
// export * from './utssdk/app-ios/index.uts';  
// #endif  
// #endif  
// 默认导出 (如果需要在非特定App平台使用,或者作为H5等平台的兜底)  
// export * from './utssdk/index.uts'; // 假设 utssdk/index.uts 包含通用或web实现
注意:上述 index.uts 的条件编译部分需要根据实际支持的平台和代码组织来编写。如果主要目标是 HarmonyOS,则 APP-HARMONY 部分是关键。  
4. 文档编写
readme.md: 提供插件的详细说明,包括功能特性、安装方法、API 文档、使用示例、作者信息等。changelog.md: 记录插件的版本更新历史和主要变更。
5. 测试与调试
- 在 HBuilderX 中创建测试页面,引入插件并调用 
parseID函数,传入不同的身份证号码进行测试。 - 关注控制台输出,确保解析结果的准确性。
 - 针对不同平台(特别是 HarmonyOS)进行真机或模拟器测试。
 
遇到的问题与解决
- UTS 模块导入路径:UTS 中模块导入路径需要精确。最初可能因为 
method.uts和index.uts的拆分导致函数重复声明或找不到定义的问题。通过将method.uts的内容合并到index.uts中解决了此问题。 - Git 推送标签失败:在版本发布时,如果本地没有对应的 Git 标签,
git push origin <tagname>会失败。通过先执行git tag <tagname>创建本地标签,然后再推送解决。 - 函数未定义错误:在页面中调用插件函数时,如果导入路径不正确或插件未正确导出函数,会导致 
xxx is not defined错误。仔细检查插件的index.uts导出逻辑和页面中的导入路径,确保一致。 
如何使用 nutpi-idcard 插件
- 
安装插件:
- 从 DCloud 插件市场安装。插件地址:https://ext.dcloud.net.cn/plugin?id=23728
 - 或者,如果手动引入,将 
nutpi-idcard整个文件夹复制到你的 uni-app 项目的uni_modules目录下。 
 - 
引入插件:在需要使用的页面或组件的
<script setup lang="uts">或<script lang="uts">中引入插件。// 示例:在页面的 <script setup lang="uts"> 中 import { parseID } from '@/uni_modules/nutpi-idcard'; // HBuilderX 会自动处理路径映射 // 如果在 uni-app x 项目的 .uvue 文件中,路径可能需要更明确,或者依赖 HBuilderX 的智能提示 - 
调用解析函数:使用
parseID函数解析身份证号码。const idNumber = '110101199003070978'; // 替换为实际的身份证号码 const idInfo = parseID(idNumber); if (idInfo) { console.log('证件类型:', idInfo.type); console.log('签发地/国家:', idInfo.sign ?? idInfo.country); console.log('出生日期:', idInfo.birthday); console.log('性别:', idInfo.sex); console.log('是否有效:', idInfo.isValid); } 
API 参考
parseID(id: string): IDResult
解析身份证号码并返回包含详细信息的对象。
- 
参数:
id: string- 需要解析的身份证号码(18位中国居民身份证,或外国人永久居留身份证等)。
 - 
返回值:
IDResult对象,其结构如下:interface IDResult { type?: string; // 证件类型 (例如:'居民身份证', '外国人永久居留身份证', '港澳台居民居住证', '未知类型') sign?: string; // 签发机关或地区信息 (例如:'北京市市辖区', '北京市朝阳区') country?: string; // 国家或地区 (例如:'中国', '无国籍' 或其他国家名称,主要用于外国人身份证) birthday?: string; // 出生日期,格式为 'YYYY-MM-DD' sex?: string; // 性别 ('男' 或 '女') isValid?: boolean; // 身份证号码是否有效 (当前版本简单返回true,待实现详细校验逻辑) } 
未来展望
- 完善校验逻辑:实现更严格的身份证号码校验,包括校验码的计算与验证。
 - 更广泛的证件类型支持:考虑支持更多国家或地区的身份证件类型。
 - 性能优化:对数据查找和字符串处理进行优化,提高解析效率。
 - 更详细的错误提示:当输入格式错误或无法解析时,提供更具体的错误信息。
 - 单元测试:为插件编写完善的单元测试,确保代码质量和稳定性。
 
作者与联系方式
- 作者:坚果派
 - 公众号:nutpi
 - 电话:17752170152
 - 官网:https://www.nutpi.net/
 - 代码仓库:https://gitcode.com/nutpi/uni-idcard
 
希望这个插件能对您有所帮助!如果您有任何问题或建议,欢迎联系。
相关链接
- UTS 语法
 - UTS API 插件
 - Hello UTS
 - 插件地址:https://ext.dcloud.net.cn/plugin?id=23728
 - 仓库地址:https://gitcode.com/nutpi/uni-idcard
 
uniappx插件nutpi-idcard 开发与使用指南(适配鸿蒙)
前言
nutpi-idcard 是一个基于 UTS (uni-app TypeScript Syntax) 开发的 uni-app 插件适配鸿蒙,主要用于解析身份证号码,提取其中的关键信息,如地区、出生日期、性别等。本插件支持中国居民身份证、港澳台居民居住证以及外国人永久居留身份证。  
本文将详细介绍 nutpi-idcard 插件的开发过程和使用方法,希望能为其他开发者提供一些参考。  
插件功能
- 身份证号码解析:能够从身份证号码中提取省市区(或国家/地区)、出生日期、性别等信息。
 - 支持多种证件类型:  
- 中国居民身份证
 - 港澳台居民居住证
 - 外国人永久居留身份证
 
 - 纯 UTS 实现:确保了插件在 uni-app x 及其他支持 UTS 的环境中的兼容性和性能。
 - 跨平台支持:理论上支持所有 uni-app 支持的平台,特别是针对 App (Android, iOS, HarmonyOS) 进行了适配。
 
开发过程
1. 项目初始化与环境搭建
插件的开发基于 HBuilderX,利用其对 uni-app 和 UTS 的良好支持。
- 创建 uni-app 项目:首先,创建一个标准的 uni-app 项目(如果还没有的话)。
 - 创建 uni_module:在项目根目录下创建 
uni_modules文件夹(如果不存在),然后在其中创建nutpi-idcard文件夹作为插件的根目录。 - 配置文件 
package.json:在nutpi-idcard目录下创建package.json文件,用于定义插件的基本信息、依赖、平台支持等。关键配置项包括:id: 插件的唯一标识。displayName: 插件在 HBuilderX 中显示的名称。version: 插件版本号。description: 插件描述。author: 作者信息-坚果派。contact: 联系方式。repository: 代码仓库地址。engines: HBuilderX 版本要求。dcloudext: DCloud 扩展配置,如插件类型 (uts)、销售信息等。uni_modules: uni-app 模块配置,如依赖、加密、平台支持等。
 
2. 核心逻辑实现 (utssdk)
插件的核心代码位于 utssdk 目录下,针对不同平台可以有不同的实现,但本项目中主要关注通用的 UTS 实现,特别是针对 HarmonyOS 的适配。  
- 
目录结构:
nutpi-idcard/ ├── utssdk/ │ ├── app-harmony/ # HarmonyOS 平台特定代码 │ │ ├── index.uts # HarmonyOS 入口及核心逻辑 │ │ ├── interfaces.uts # TypeScript 接口定义 │ │ └── module/ │ │ └── data/ # 数据文件 (行政区划、国家代码) │ │ ├── china.uts │ │ └── international.uts │ ├── app-android/ # Android 平台 (如果需要特定实现) │ ├── app-ios/ # iOS 平台 (如果需要特定实现) │ ├── index.uts # 插件主入口 (通常导出各平台实现) │ └── interfaces.uts # 通用接口定义 ├── package.json ├── readme.md └── changelog.md - 
数据准备 (
module/data/):china.uts: 存储中国行政区划代码与名称的映射。international.uts: 存储 ISO 3166-1 国家代码与名称的映射。
 - 
接口定义 (
interfaces.uts):
定义了身份证解析结果的数据结构IDResult。export interface IDResult { type?: string; // 证件类型 sign?: string; // 签发机关或地区 country?: string; // 国家或地区 birthday?: string; // 出生日期 (YYYY-MM-DD) sex?: string; // 性别 ('男' 或 '女') isValid?: boolean; // 校验结果 (当前版本简单返回 true) } - 
核心解析逻辑 (
app-harmony/index.uts):
这是插件的核心,包含了主要的解析函数。parseID(id: string): IDResult: 公开的 API 函数,根据身份证号码的格式(通过正则表达式判断)调用相应的内部解析函数。parserChina(id: string): IDResult: 解析中国居民身份证和港澳台居民居住证。- 通过身份证号码的前6位确定省市区。
 - 通过第7到14位确定出生日期。
 - 通过第17位(顺序码的最后一位)确定性别。
 parserInternational(id: string): IDResult: 解析外国人永久居留身份证。- 通过第1到3位(国家或地区代码)和 
international.uts数据确定国家。 - 通过第7到14位确定出生日期。
 - 通过第17位确定性别。
 isIdCardValidInternal(id: string): boolean: 身份证号码有效性校验函数。目前简单返回true,未来可以根据国家标准实现更复杂的校验逻辑(如校验码计算)。
// idcard/uni_modules/nutpi-idcard/utssdk/app-harmony/index.uts import { chinaData as _china } from './module/data/china.uts'; import { internationalData as _international } from './module/data/international.uts'; import type { IDResult } from './interfaces.uts'; function parserInternational(id: string): IDResult { /* ... */ } function parserChina(id: string): IDResult { /* ... */ } function isIdCardValidInternal(id: string): boolean { /* ... */ } export function parseID(id: string): IDResult { if(id.match(/^9\d{16}[0-9xX]$/)){ // 外国人永久居留身份证特征 (假设以9开头) return parserInternational(id); }else if(id.match(/^\d{17}[0-9xX]$/)){ // 中国居民身份证特征 return parserChina(id); }else{ return { type: '未知类型' }; } } 
3. 插件入口 (index.uts)
在 nutpi-idcard 根目录下的 index.uts 文件通常作为插件的统一入口,它会根据当前运行平台导出相应平台的 parseID 函数。  
// idcard/uni_modules/nutpi-idcard/index.uts  
// #ifdef APP-HARMONY  
export * from './utssdk/app-harmony/index.uts';  
// #endif  
// #ifdef APP-PLUS || APP-VUE  
// 假设 Android 和 iOS 使用相同的 UTS 逻辑,或者有单独的 app-android/index.uts 和 app-ios/index.uts  
// 如果 utssdk/index.uts 包含了 Android 和 iOS 的通用逻辑,可以这样导出:  
// export * from './utssdk/index.uts';   
// 或者分别导出  
// #ifdef APP-ANDROID  
// export * from './utssdk/app-android/index.uts';  
// #endif  
// #ifdef APP-IOS  
// export * from './utssdk/app-ios/index.uts';  
// #endif  
// #endif  
// 默认导出 (如果需要在非特定App平台使用,或者作为H5等平台的兜底)  
// export * from './utssdk/index.uts'; // 假设 utssdk/index.uts 包含通用或web实现
注意:上述 index.uts 的条件编译部分需要根据实际支持的平台和代码组织来编写。如果主要目标是 HarmonyOS,则 APP-HARMONY 部分是关键。  
4. 文档编写
readme.md: 提供插件的详细说明,包括功能特性、安装方法、API 文档、使用示例、作者信息等。changelog.md: 记录插件的版本更新历史和主要变更。
5. 测试与调试
- 在 HBuilderX 中创建测试页面,引入插件并调用 
parseID函数,传入不同的身份证号码进行测试。 - 关注控制台输出,确保解析结果的准确性。
 - 针对不同平台(特别是 HarmonyOS)进行真机或模拟器测试。
 
遇到的问题与解决
- UTS 模块导入路径:UTS 中模块导入路径需要精确。最初可能因为 
method.uts和index.uts的拆分导致函数重复声明或找不到定义的问题。通过将method.uts的内容合并到index.uts中解决了此问题。 - Git 推送标签失败:在版本发布时,如果本地没有对应的 Git 标签,
git push origin <tagname>会失败。通过先执行git tag <tagname>创建本地标签,然后再推送解决。 - 函数未定义错误:在页面中调用插件函数时,如果导入路径不正确或插件未正确导出函数,会导致 
xxx is not defined错误。仔细检查插件的index.uts导出逻辑和页面中的导入路径,确保一致。 
如何使用 nutpi-idcard 插件
- 
安装插件:
- 从 DCloud 插件市场安装。插件地址:https://ext.dcloud.net.cn/plugin?id=23728
 - 或者,如果手动引入,将 
nutpi-idcard整个文件夹复制到你的 uni-app 项目的uni_modules目录下。 
 - 
引入插件:在需要使用的页面或组件的
<script setup lang="uts">或<script lang="uts">中引入插件。// 示例:在页面的 <script setup lang="uts"> 中 import { parseID } from '@/uni_modules/nutpi-idcard'; // HBuilderX 会自动处理路径映射 // 如果在 uni-app x 项目的 .uvue 文件中,路径可能需要更明确,或者依赖 HBuilderX 的智能提示 - 
调用解析函数:使用
parseID函数解析身份证号码。const idNumber = '110101199003070978'; // 替换为实际的身份证号码 const idInfo = parseID(idNumber); if (idInfo) { console.log('证件类型:', idInfo.type); console.log('签发地/国家:', idInfo.sign ?? idInfo.country); console.log('出生日期:', idInfo.birthday); console.log('性别:', idInfo.sex); console.log('是否有效:', idInfo.isValid); } 
API 参考
parseID(id: string): IDResult
解析身份证号码并返回包含详细信息的对象。
- 
参数:
id: string- 需要解析的身份证号码(18位中国居民身份证,或外国人永久居留身份证等)。
 - 
返回值:
IDResult对象,其结构如下:interface IDResult { type?: string; // 证件类型 (例如:'居民身份证', '外国人永久居留身份证', '港澳台居民居住证', '未知类型') sign?: string; // 签发机关或地区信息 (例如:'北京市市辖区', '北京市朝阳区') country?: string; // 国家或地区 (例如:'中国', '无国籍' 或其他国家名称,主要用于外国人身份证) birthday?: string; // 出生日期,格式为 'YYYY-MM-DD' sex?: string; // 性别 ('男' 或 '女') isValid?: boolean; // 身份证号码是否有效 (当前版本简单返回true,待实现详细校验逻辑) } 
未来展望
- 完善校验逻辑:实现更严格的身份证号码校验,包括校验码的计算与验证。
 - 更广泛的证件类型支持:考虑支持更多国家或地区的身份证件类型。
 - 性能优化:对数据查找和字符串处理进行优化,提高解析效率。
 - 更详细的错误提示:当输入格式错误或无法解析时,提供更具体的错误信息。
 - 单元测试:为插件编写完善的单元测试,确保代码质量和稳定性。
 
作者与联系方式
- 作者:坚果派
 - 公众号:nutpi
 - 电话:17752170152
 - 官网:https://www.nutpi.net/
 - 代码仓库:https://gitcode.com/nutpi/uni-idcard
 
希望这个插件能对您有所帮助!如果您有任何问题或建议,欢迎联系。
相关链接
- UTS 语法
 - UTS API 插件
 - Hello UTS
 - 插件地址:https://ext.dcloud.net.cn/plugin?id=23728
 - 仓库地址:https://gitcode.com/nutpi/uni-idcard
 
【建议】建议uniapp x 增加 uni.preloadPage 预加载
有看到帖子官方觉得 uni app x 是原生编译没必要预加载,但其实还是非常有必要的!!
实际业务开发中会有一些逻辑复杂的页面,onLoad加载时间会比较多,比如100-200毫秒那也会导致加载页面不够丝滑;
我们做原生开发的时候,经常会预加载组件和加载数据,但是组件还是隐藏的状态
目的就是为了在用户点击某个页面的时候,就直接将隐藏属性改成显示
这样用户点击到查看页面速度会超级无敌快,用户感知不到加载的过程  
所以非常建议官方适配一下 uni.preloadPage 这个方法。
有看到帖子官方觉得 uni app x 是原生编译没必要预加载,但其实还是非常有必要的!!
实际业务开发中会有一些逻辑复杂的页面,onLoad加载时间会比较多,比如100-200毫秒那也会导致加载页面不够丝滑;
我们做原生开发的时候,经常会预加载组件和加载数据,但是组件还是隐藏的状态
目的就是为了在用户点击某个页面的时候,就直接将隐藏属性改成显示
这样用户点击到查看页面速度会超级无敌快,用户感知不到加载的过程  
所以非常建议官方适配一下 uni.preloadPage 这个方法。
收起阅读 »如何使用uniapp的evalJS
使用evalJS的时候,看文档说使用的是js脚本,webview内部嵌套一个html。
我的情况下是,webview里面嵌套的是html,然后html使用的是vue。
在setup()里面设置window.XX方法。
webview:
window.XX= function(){   
 let a = '.....localStorage.getItem a'  
 let b = '.....localStorage.getItem b'  
 let c = '.....localStorage.getItem c'  
 xxx()//自定义调用方法  
}
nvue:
webviewElement?.value.evalJS("localStorage.setItem('a',"+a+")");  
webviewElement?.value.evalJS("localStorage.setItem('b',"+b+")");  
webviewElement?.value.evalJS("localStorage.setItem('c',"+c+")");  
webviewElement?.value.evalJS("XX()");
我目前尝试过,使用缓存的方式去传递参数。然后获取到参数后,再去调用一次想要的方法。就能实现在uvue页面下,传递参数去webview里面的方法,再调用webview里面的方法!
使用evalJS的时候,看文档说使用的是js脚本,webview内部嵌套一个html。
我的情况下是,webview里面嵌套的是html,然后html使用的是vue。
在setup()里面设置window.XX方法。
webview:
window.XX= function(){   
 let a = '.....localStorage.getItem a'  
 let b = '.....localStorage.getItem b'  
 let c = '.....localStorage.getItem c'  
 xxx()//自定义调用方法  
}
nvue:
webviewElement?.value.evalJS("localStorage.setItem('a',"+a+")");  
webviewElement?.value.evalJS("localStorage.setItem('b',"+b+")");  
webviewElement?.value.evalJS("localStorage.setItem('c',"+c+")");  
webviewElement?.value.evalJS("XX()");
我目前尝试过,使用缓存的方式去传递参数。然后获取到参数后,再去调用一次想要的方法。就能实现在uvue页面下,传递参数去webview里面的方法,再调用webview里面的方法!
收起阅读 »基于vue3.5+vite7+electron38仿微信/QQ电脑端聊天应用
vue3-electron38-wechat:一款最新原创跨平台electron38+vite7.0+vue3 setup+pinia3+element-plus等技术构建的仿微信电脑端聊天系统。包含了聊天、通讯录、收藏、朋友圈、短视频、我的等模块。  
技术框架
- 前端框架:vite7.1.2+vue3.5.18+vue-router4.5.1
 - 跨平台框架:electron38.0.0
 - 组件库:element-plus^2.11.2
 - 状态管理:pinia^3.0.3
 - 存储服务:pinia-plugin-persistedstate^4.5.0
 - 打包构建:electron-builder^24.13.3
 - electron结合vite插件:vite-plugin-electron^0.29.0
 
项目框架结构目录
最新跨平台框架electron38+vite7创建项目模板,vue3 setup语法编码。  
electron-vue3-winchat聊天项目已经同步到我的原创作品集。
热文推荐
uniapp-vue3-os手机oa系统|uni-app+vue3跨三端os后台管理模板
最新版uni-app+vue3+uv-ui跨三端仿微信app聊天应用【h5+小程序+app端】
Flutter3-MacOS桌面OS系统|flutter3.32+window_manager客户端OS模板
最新研发flutter3.27+bitsdojo_window+getx客户端仿微信聊天Exe应用
最新版Flutter3.32+Dart3.8跨平台仿微信app聊天界面|朋友圈
最新版uniapp+vue3+uv-ui跨三端短视频+直播+聊天【H5+小程序+App端】
原创uniapp+vue3+deepseek+uv-ui跨端实战仿deepseek/豆包流式ai聊天对话助手。
vue3-webseek网页版AI问答|Vite6+DeepSeek+Arco流式ai聊天打字效果
Electron35-DeepSeek桌面端AI系统|vue3.5+electron+arco客户端ai模板
uniapp+vue3酒店预订|vite5+uniapp预约订房系统模板(h5+小程序+App端)
Electron32-Vue3OS桌面版os系统|vue3+electron+arco客户端OS管理模板
Tauri2.0+Vite5聊天室|vue3+tauri2+element-plus仿微信|tauri聊天应用
tauri2.0-admin桌面端后台系统|Tauri2+Vite5+ElementPlus管理后台EXE程序  
vue3-electron38-wechat:一款最新原创跨平台electron38+vite7.0+vue3 setup+pinia3+element-plus等技术构建的仿微信电脑端聊天系统。包含了聊天、通讯录、收藏、朋友圈、短视频、我的等模块。  
技术框架
- 前端框架:vite7.1.2+vue3.5.18+vue-router4.5.1
 - 跨平台框架:electron38.0.0
 - 组件库:element-plus^2.11.2
 - 状态管理:pinia^3.0.3
 - 存储服务:pinia-plugin-persistedstate^4.5.0
 - 打包构建:electron-builder^24.13.3
 - electron结合vite插件:vite-plugin-electron^0.29.0
 
项目框架结构目录
最新跨平台框架electron38+vite7创建项目模板,vue3 setup语法编码。  
electron-vue3-winchat聊天项目已经同步到我的原创作品集。
热文推荐
uniapp-vue3-os手机oa系统|uni-app+vue3跨三端os后台管理模板
最新版uni-app+vue3+uv-ui跨三端仿微信app聊天应用【h5+小程序+app端】
Flutter3-MacOS桌面OS系统|flutter3.32+window_manager客户端OS模板
最新研发flutter3.27+bitsdojo_window+getx客户端仿微信聊天Exe应用
最新版Flutter3.32+Dart3.8跨平台仿微信app聊天界面|朋友圈
最新版uniapp+vue3+uv-ui跨三端短视频+直播+聊天【H5+小程序+App端】
原创uniapp+vue3+deepseek+uv-ui跨端实战仿deepseek/豆包流式ai聊天对话助手。
vue3-webseek网页版AI问答|Vite6+DeepSeek+Arco流式ai聊天打字效果
Electron35-DeepSeek桌面端AI系统|vue3.5+electron+arco客户端ai模板
uniapp+vue3酒店预订|vite5+uniapp预约订房系统模板(h5+小程序+App端)
Electron32-Vue3OS桌面版os系统|vue3+electron+arco客户端OS管理模板
Tauri2.0+Vite5聊天室|vue3+tauri2+element-plus仿微信|tauri聊天应用
tauri2.0-admin桌面端后台系统|Tauri2+Vite5+ElementPlus管理后台EXE程序  
组件库示例已上传鸿蒙应用市场,欢迎大家下载体验
组件库示例已上传鸿蒙应用市场,欢迎大家下载体验;
插件地址:https://ext.dcloud.net.cn/plugin?id=24907
组件库示例已上传鸿蒙应用市场,欢迎大家下载体验;
插件地址:https://ext.dcloud.net.cn/plugin?id=24907
免费开源的uniappx UI框架,支持鸿蒙,APP,小程序,H5
免费开源的uniappx UI框架,支持鸿蒙,APP,小程序,H5,欢迎使用~ https://ext.dcloud.net.cn/plugin?id=24907
免费开源的uniappx UI框架,支持鸿蒙,APP,小程序,H5,欢迎使用~ https://ext.dcloud.net.cn/plugin?id=24907
uniapp-x云打包报一堆未定义
以下是HBuilderX云打包编译错误信息,分析一下是什么原因?
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/edit_datika.kt:30:100 Cannot infer a type for this parameter. Please specify it explicitly.
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/edit_datika.kt:30:105 Cannot infer a type for this parameter. Please specify it explicitly.
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/edit_datika.kt:30:112 Cannot infer a type for this parameter. Please specify it explicitly.
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/edit_datika.kt:30:121 Cannot infer a type for this parameter. Please specify it explicitly.
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/edit_datika.kt:31:40 Not enough information to infer type variable V
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/edit_datika.kt:80:24 Unresolved reference: kObject
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/edit_datika.kt:80:36 Property delegate must have a 'setValue(GenComponentsEditDatika, KProperty<>, [Error type: Unresolved type for kObject]?)' method. None of the following functions is suitable:
public inline operator fun <V> Map<in String, in Any?>.setValue(thisRef: Any?, property: KProperty<>, value: Any?): Unit defined in io.dcloud.uts
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/edit_datika.kt:93:50 Variable expected
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/edit_datika.kt:95:50 Variable expected
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/edit_datika.kt:106:50 Variable expected
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/editor.kt:44:32 Type expected
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/editor.kt:45:29 Type expected
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/editor.kt:45:29 Unexpected tokens (use ';' to separate expressions on the same line)
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/editor.kt:48:14 Unexpected tokens (use ';' to separate expressions on the same line)
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/editor.kt:64:37 Type expected
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/editor.kt:65:29 Type expected
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/editor.kt:65:29 Unexpected tokens (use ';' to separate expressions on the same line)
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/editor.kt:68:14 Unexpected tokens (use ';' to separate expressions on the same line)
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/editor.kt:25:43 Unresolved reference: ctx
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/editor.kt:26:44 Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type ComponentInternalInstance?
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/editor.kt:30:39 Unresolved reference: EditorContext
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/editor.kt:34:24 Type mismatch: inferred type is String but Unit was expected
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/editor.kt:49:50 Unresolved reference: e
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/editor.kt:54:43 Unresolved reference: context
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/editor.kt:55:44 Type mismatch: inferred type is String but Boolean was expected
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/editor.kt:69:50 Unresolved reference: e
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/subBar.kt:21:41 Unresolved reference: id
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/subBar.kt:39:143 Unresolved reference: title
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/subBar.kt:41:38 Unresolved reference: type
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/subBar.kt:42:91 Unresolved reference: type
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/subBar.kt:47:132 Unresolved reference: jctotal
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/subBar.kt:49:84 Unresolved reference: start
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/subBar.kt:51:89 Unresolved reference: currentPrice
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/subBar.kt:52:90 Unresolved reference: originalPrice
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/subBar.kt:70:42 A type annotation is required on a value parameter
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/subBar.kt:74:31 A type annotation is required on a value parameter
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/treeBar.kt:25:78 An anonymous function is not allowed to specify default values for its parameters
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/treeBar.kt:30:29 Type mismatch: inferred type is Boolean? but Boolean was expected
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/treeBar.kt:30:46 Type mismatch: inferred type is UTSArray<TreeNode>? but Boolean was expected
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/treeBar.kt:31:52 Unresolved reference. None of the following candidates is applicable because of receiver type mismatch:
public fun <T> Array<out Array<out TypeVariable(T)>>.flatten(): List<TypeVariable(T)> defined in kotlin.collections
public fun <T> Iterable<Iterable<TypeVariable(T)>>.flatten(): List<TypeVariable(T)> defined in kotlin.collections
private fun <T, R> Sequence<TypeVariable(T)>.flatten(iterator: (TypeVariable(T)) -> Iterator<TypeVariable(R)>): Sequence<TypeVariable(R)> defined in kotlin.sequences
public fun <T> Sequence<Iterable<TypeVariable(T)>>.flatten(): Sequence<TypeVariable(T)> defined in kotlin.sequences
public fun <T> Sequence<Sequence<TypeVariable(T)>>.flatten(): Sequence<TypeVariable(T)> defined in kotlin.sequences
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/treeBar.kt:37:33 No value passed for parameter 'p2'
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/treeBar.kt:42:21 Type mismatch: inferred type is UTSArray<TreeNode>? but Boolean was expected
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/treeBar.kt:43:37 Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type Boolean?
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/treeBar.kt:50:25 Type mismatch: inferred type is UTSArray<TreeNode>? but Boolean was expected
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/treeBar.kt:51:25 Unresolved reference: initTreeData
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/treeBar.kt:57:46 Operator call corresponds to a dot-qualified call 'level.compareTo(2)' which is not allowed on a nullable receiver 'level'.
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/treeBar.kt:63:47 Operator call corresponds to a dot-qualified call 'level.times(30)' which is not allowed on a nullable receiver 'level'.
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/treeBar.kt:66:39 Operator call corresponds to a dot-qualified call 'level.compareTo(0)' which is not allowed on a nullable receiver 'level'.
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/treeBar.kt:71:51 Operator call corresponds to a dot-qualified call 'level.times(3)' which is not allowed on a nullable receiver 'level'.
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/treeBar.kt:74:24 Type mismatch: inferred type is UTSArray<TreeNode> but Unit was expected
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/treeBar.kt:76:19 Cannot infer a type for this parameter. Please specify it explicitly.
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/treeBar.kt:94:101 Type mismatch: inferred type is Boolean? but Boolean was expected
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/treeBar.kt:99:70 Type mismatch: inferred type is Boolean? but Boolean was expected
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/index.kt:153:11 Redeclaration: Detail
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/index.kt:191:79 Unresolved reference: GenUniModulesUniPopupComponentsUniPopupUniPopup
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/index.kt:192:59 Unresolved reference: GenUniModulesUniPopupComponentsUniPopupUniPopup
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/index.kt:192:128 Unresolved reference: GenUniModulesUniPopupComponentsUniPopupUniPopup
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/index.kt:192:199 Unresolved reference: GenUniModulesUniPopupComponentsUniPopupUniPopup
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/index.kt:192:263 Unresolved reference: GenUniModulesUniPopupComponentsUniPopupUniPopup
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/index.kt:192:338 Unresolved reference: GenUniModulesUniPopupComponentsUniPopupUniPopup
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/index.kt:192:413 Unresolved reference: GenUniModulesUniPopupComponentsUniPopupUniPopup
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/index.kt:192:481 Unresolved reference: GenUniModulesUniPopupComponentsUniPopupUniPopup
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/index.kt:192:550 Unresolved reference: GenUniModulesUniPopupComponentsUniPopupUniPopup
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/index.kt:194:28 Unresolved reference: GenUniModulesUniPopupComponentsUniPopupUniPopup
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/index.kt:195:12 Unresolved reference: GenUniModulesUniPopupComponentsUniPopupUniPopup
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/index.kt:263:11 Redeclaration: Detail
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/index.kt:266:11 Redeclaration: PickerChangeEvent
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/index.kt:290:11 Redeclaration: Detail
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/index.kt:293:11 Redeclaration: PickerChangeEvent
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/index.kt:424:11 Redeclaration: Detail
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/exam/answer_sheet.kt:93:42 A type annotation is required on a value parameter
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/exam/answer_sheet.kt:93:47 A type annotation is required on a value parameter
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/exam/exam.kt:100:33 A type annotation is required on a value parameter
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/exam/exam_record.kt:33:79 Unresolved reference: title
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/exam/exam_record.kt:34:79 Unresolved reference: sub
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/exam/exam_record.kt:35:79 Unresolved reference: score
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/exam/exam_record.kt:36:79 Unresolved reference: date
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/exam/start_exam.kt:140:22 Unresolved reference: popup
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/exam/wrong_ques.kt:29:168 Unresolved reference: type
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/exam/wrong_ques.kt:32:82 Unresolved reference: fenleis
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/exam/wrong_ques.kt:32:95 Cannot infer a type for this parameter. Please specify it explicitly.
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/exam/wrong_ques.kt:32:101 Cannot infer a type for this parameter. Please specify it explicitly.
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/exam/wrong_ques.kt:32:108 Cannot infer a type for this parameter. Please specify it explicitly.
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/exam/wrong_ques.kt:32:117 Cannot infer a type for this parameter. Please specify it explicitly.
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/home/home.kt:36:64 Unresolved reference: url
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/subject/order_subject.kt:60:31 A type annotation is required on a value parameter
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/subject/subject.kt:28:47 Unresolved reference: text
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/subject/subject.kt:31:124 Unresolved reference: url
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/subject/subject.kt:34:125 Unresolved reference: text
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/subject/subject.kt:117:32 A type annotation is required on a value parameter
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/subject/subject.kt:121:29 A type annotation is required on a value parameter
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/subject/subject_detal.kt:24:70 Unresolved reference: title
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/subject/subject_list.kt:18:23 Unresolved reference: type
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/subject/subject_list.kt:21:36 Unresolved reference: type
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/subject/subject_list.kt:116:34 Unresolved reference: scrollTop
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/userinfo/edit_touxiang.kt:64:22 Unresolved reference: popup
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/userinfo/user_zhongxin_birthday.kt:72:30 Unresolved reference: value
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/userinfo/user_zhongxin_educational.kt:58:31 Unresolved reference: value  
FAILURE: Build failed with an exception.
- 
What went wrong:
Execution failed for task ':app:compileReleaseKotlin'.
> A failure occurred while executing org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction
> Compilation error. See log for more details - 
Try:
> Run with --debug option to get more log output.
> Run with --scan to get full insights.
> Get more help at https://help.gradle.org. - 
Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:compileReleaseKotlin'.
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:130)
at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:293)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:128)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:116)
at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74)
at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:42)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:331)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:318)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.lambda$execute$0(DefaultTaskExecutionGraph.java:314)
at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:85)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:314)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:303)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:459)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:376)
at org.gradle.execution.plan.DefaultPlanExecutor.process(DefaultPlanExecutor.java:111)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph.executeWithServices(DefaultTaskExecutionGraph.java:138)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph.execute(DefaultTaskExecutionGraph.java:123)
at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:35)
at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:51)
at org.gradle.execution.BuildOperationFiringBuildWorkerExecutor$ExecuteTasks.call(BuildOperationFiringBuildWorkerExecutor.java:54)
at org.gradle.execution.BuildOperationFiringBuildWorkerExecutor$ExecuteTasks.call(BuildOperationFiringBuildWorkerExecutor.java:43)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
at org.gradle.execution.BuildOperationFiringBuildWorkerExecutor.execute(BuildOperationFiringBuildWorkerExecutor.java:40)
at org.gradle.internal.build.DefaultBuildLifecycleController.lambda$executeTasks$10(DefaultBuildLifecycleController.java:313)
at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:266)
at org.gradle.internal.model.StateTransitionController.lambda$tryTransition$8(StateTransitionController.java:177)
at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:46)
at org.gradle.internal.model.StateTransitionController.tryTransition(StateTransitionController.java:177)
at org.gradle.internal.build.DefaultBuildLifecycleController.executeTasks(DefaultBuildLifecycleController.java:304)
at org.gradle.internal.build.DefaultBuildWorkGraphController$DefaultBuildWorkGraph.runWork(DefaultBuildWorkGraphController.java:220)
at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:263)
at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:127)
at org.gradle.composite.internal.DefaultBuildController.doRun(DefaultBuildController.java:181)
at org.gradle.composite.internal.DefaultBuildController.access$000(DefaultBuildController.java:50)
at org.gradle.composite.internal.DefaultBuildController$BuildOpRunnable.lambda$run$0(DefaultBuildController.java:198)
at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:85)
at org.gradle.composite.internal.DefaultBuildController$BuildOpRunnable.run(DefaultBuildController.java:198)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:48)
Caused by: org.gradle.workers.internal.DefaultWorkerExecutor$WorkExecutionException: A failure occurred while executing org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction
at org.gradle.workers.internal.DefaultWorkerExecutor$WorkItemExecution.waitForCompletion(DefaultWorkerExecutor.java:287)
at org.gradle.internal.work.DefaultAsyncWorkTracker.lambda$waitForItemsAndGatherFailures$2(DefaultAsyncWorkTracker.java:130)
at org.gradle.internal.Factories$1.create(Factories.java:31)
at org.gradle.internal.work.DefaultWorkerLeaseService.withoutLocks(DefaultWorkerLeaseService.java:335)
at org.gradle.internal.work.DefaultWorkerLeaseService.withoutLocks(DefaultWorkerLeaseService.java:318)
at org.gradle.internal.work.DefaultWorkerLeaseService.withoutLock(DefaultWorkerLeaseService.java:323)
at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForItemsAndGatherFailures(DefaultAsyncWorkTracker.java:126)
at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForItemsAndGatherFailures(DefaultAsyncWorkTracker.java:92)
at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForAll(DefaultAsyncWorkTracker.java:78)
at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForCompletion(DefaultAsyncWorkTracker.java:66)
at org.gradle.api.internal.tasks.execution.TaskExecution$3.run(TaskExecution.java:252)
at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
at org.gradle.api.internal.tasks.execution.TaskExecution.executeAction(TaskExecution.java:229)
at org.gradle.api.internal.tasks.execution.TaskExecution.executeActions(TaskExecution.java:212)
at org.gradle.api.internal.tasks.execution.TaskExecution.executeWithPreviousOutputFiles(TaskExecution.java:195)
at org.gradle.api.internal.tasks.execution.TaskExecution.execute(TaskExecution.java:162)
at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:105)
at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:44)
at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:59)
at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:56)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:56)
at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:44)
at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:42)
at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:75)
at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55)
at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:50)
at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:28)
at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:67)
at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:37)
at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:61)
at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:26)
at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:69)
at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:46)
at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:40)
at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:29)
at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:189)
at org.gradle.internal.execution.steps.BuildCacheStep.lambda$execute$1(BuildCacheStep.java:75)
at org.gradle.internal.Either$Right.fold(Either.java:175)
at org.gradle.internal.execution.caching.CachingState.fold(CachingState.java:62)
at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:73)
at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:48)
at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:46)
at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:35)
at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:75)
at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$2(SkipUpToDateStep.java:53)
at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:53)
at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:35)
at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37)
at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27)
at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:49)
at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:27)
at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:71)
at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:39)
at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:65)
at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:36)
at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:107)
at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:56)
at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:64)
at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:43)
at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.executeWithNonEmptySources(AbstractSkipEmptyWorkStep.java:125)
at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:61)
at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:36)
at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38)
at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:36)
at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:23)
at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:75)
at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:41)
at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.lambda$execute$0(AssignMutableWorkspaceStep.java:35)
at org.gradle.api.internal.tasks.execution.TaskExecution$4.withWorkspace(TaskExecution.java:289)
at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:31)
at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:22)
at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:40)
at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:23)
at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.lambda$execute$2(ExecuteWorkBuildOperationFiringStep.java:67)
at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:67)
at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:39)
at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:46)
at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:34)
at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:48)
at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:35)
at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:61)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:127)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:116)
at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74)
at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:42)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:331)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:318)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.lambda$execute$0(DefaultTaskExecutionGraph.java:314)
at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:85)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:314)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:303)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:459)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:376)
at org.gradle.execution.plan.DefaultPlanExecutor.process(DefaultPlanExecutor.java:111)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph.executeWithServices(DefaultTaskExecutionGraph.java:138)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph.execute(DefaultTaskExecutionGraph.java:123)
at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:35)
at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:51)
at org.gradle.execution.BuildOperationFiringBuildWorkerExecutor$ExecuteTasks.call(BuildOperationFiringBuildWorkerExecutor.java:54)
at org.gradle.execution.BuildOperationFiringBuildWorkerExecutor$ExecuteTasks.call(BuildOperationFiringBuildWorkerExecutor.java:43)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
at org.gradle.execution.BuildOperationFiringBuildWorkerExecutor.execute(BuildOperationFiringBuildWorkerExecutor.java:40)
at org.gradle.internal.build.DefaultBuildLifecycleController.lambda$executeTasks$10(DefaultBuildLifecycleController.java:313)
at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:266)
at org.gradle.internal.model.StateTransitionController.lambda$tryTransition$8(StateTransitionController.java:177)
at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:46)
at org.gradle.internal.model.StateTransitionController.tryTransition(StateTransitionController.java:177)
at org.gradle.internal.build.DefaultBuildLifecycleController.executeTasks(DefaultBuildLifecycleController.java:304)
at org.gradle.internal.build.DefaultBuildWorkGraphController$DefaultBuildWorkGraph.runWork(DefaultBuildWorkGraphController.java:220)
at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:263)
at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:127)
at org.gradle.composite.internal.DefaultBuildController.doRun(DefaultBuildController.java:181)
at org.gradle.composite.internal.DefaultBuildController.access$000(DefaultBuildController.java:50)
at org.gradle.composite.internal.DefaultBuildController$BuildOpRunnable.lambda$run$0(DefaultBuildController.java:198)
at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:85)
at org.gradle.composite.internal.DefaultBuildController$BuildOpRunnable.run(DefaultBuildController.java:198)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:48)
Caused by: org.jetbrains.kotlin.gradle.tasks.CompilationErrorException: Compilation error. See log for more details
at org.jetbrains.kotlin.gradle.tasks.TasksUtilsKt.throwExceptionIfCompilationFailed(tasksUtils.kt:22)
at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.run(GradleKotlinCompilerWork.kt:144)
at org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction.execute(GradleCompilerRunnerWithWorkers.kt:76)
at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:63)
at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:66)
at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:62)
at org.gradle.internal.classloader.ClassLoaderUtils.executeInClassloader(ClassLoaderUtils.java:100)
at org.gradle.workers.internal.NoIsolationWorkerFactory$1.lambda$execute$0(NoIsolationWorkerFactory.java:62)
at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:44)
at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:41)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
at org.gradle.workers.internal.AbstractWorker.executeWrappedInBuildOperation(AbstractWorker.java:41)
at org.gradle.workers.internal.NoIsolationWorkerFactory$1.execute(NoIsolationWorkerFactory.java:59)
at org.gradle.workers.internal.DefaultWorkerExecutor.lambda$submitWork$0(DefaultWorkerExecutor.java:174)
at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runExecution(DefaultConditionalExecutionQueue.java:194)
at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.access$700(DefaultConditionalExecutionQueue.java:127)
at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner$1.run(DefaultConditionalExecutionQueue.java:169)
at org.gradle.internal.Factories$1.create(Factories.java:31)
at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:263)
at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:127)
at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:132)
at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runBatch(DefaultConditionalExecutionQueue.java:164)
at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.run(DefaultConditionalExecutionQueue.java:133)
... 2 moreBUILD FAILED in 1m 36s
gradle build error: 1 
以下是HBuilderX云打包编译错误信息,分析一下是什么原因?
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/edit_datika.kt:30:100 Cannot infer a type for this parameter. Please specify it explicitly.
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/edit_datika.kt:30:105 Cannot infer a type for this parameter. Please specify it explicitly.
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/edit_datika.kt:30:112 Cannot infer a type for this parameter. Please specify it explicitly.
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/edit_datika.kt:30:121 Cannot infer a type for this parameter. Please specify it explicitly.
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/edit_datika.kt:31:40 Not enough information to infer type variable V
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/edit_datika.kt:80:24 Unresolved reference: kObject
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/edit_datika.kt:80:36 Property delegate must have a 'setValue(GenComponentsEditDatika, KProperty<>, [Error type: Unresolved type for kObject]?)' method. None of the following functions is suitable:
public inline operator fun <V> Map<in String, in Any?>.setValue(thisRef: Any?, property: KProperty<>, value: Any?): Unit defined in io.dcloud.uts
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/edit_datika.kt:93:50 Variable expected
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/edit_datika.kt:95:50 Variable expected
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/edit_datika.kt:106:50 Variable expected
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/editor.kt:44:32 Type expected
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/editor.kt:45:29 Type expected
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/editor.kt:45:29 Unexpected tokens (use ';' to separate expressions on the same line)
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/editor.kt:48:14 Unexpected tokens (use ';' to separate expressions on the same line)
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/editor.kt:64:37 Type expected
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/editor.kt:65:29 Type expected
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/editor.kt:65:29 Unexpected tokens (use ';' to separate expressions on the same line)
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/editor.kt:68:14 Unexpected tokens (use ';' to separate expressions on the same line)
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/editor.kt:25:43 Unresolved reference: ctx
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/editor.kt:26:44 Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type ComponentInternalInstance?
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/editor.kt:30:39 Unresolved reference: EditorContext
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/editor.kt:34:24 Type mismatch: inferred type is String but Unit was expected
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/editor.kt:49:50 Unresolved reference: e
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/editor.kt:54:43 Unresolved reference: context
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/editor.kt:55:44 Type mismatch: inferred type is String but Boolean was expected
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/editor.kt:69:50 Unresolved reference: e
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/subBar.kt:21:41 Unresolved reference: id
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/subBar.kt:39:143 Unresolved reference: title
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/subBar.kt:41:38 Unresolved reference: type
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/subBar.kt:42:91 Unresolved reference: type
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/subBar.kt:47:132 Unresolved reference: jctotal
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/subBar.kt:49:84 Unresolved reference: start
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/subBar.kt:51:89 Unresolved reference: currentPrice
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/subBar.kt:52:90 Unresolved reference: originalPrice
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/subBar.kt:70:42 A type annotation is required on a value parameter
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/subBar.kt:74:31 A type annotation is required on a value parameter
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/treeBar.kt:25:78 An anonymous function is not allowed to specify default values for its parameters
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/treeBar.kt:30:29 Type mismatch: inferred type is Boolean? but Boolean was expected
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/treeBar.kt:30:46 Type mismatch: inferred type is UTSArray<TreeNode>? but Boolean was expected
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/treeBar.kt:31:52 Unresolved reference. None of the following candidates is applicable because of receiver type mismatch:
public fun <T> Array<out Array<out TypeVariable(T)>>.flatten(): List<TypeVariable(T)> defined in kotlin.collections
public fun <T> Iterable<Iterable<TypeVariable(T)>>.flatten(): List<TypeVariable(T)> defined in kotlin.collections
private fun <T, R> Sequence<TypeVariable(T)>.flatten(iterator: (TypeVariable(T)) -> Iterator<TypeVariable(R)>): Sequence<TypeVariable(R)> defined in kotlin.sequences
public fun <T> Sequence<Iterable<TypeVariable(T)>>.flatten(): Sequence<TypeVariable(T)> defined in kotlin.sequences
public fun <T> Sequence<Sequence<TypeVariable(T)>>.flatten(): Sequence<TypeVariable(T)> defined in kotlin.sequences
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/treeBar.kt:37:33 No value passed for parameter 'p2'
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/treeBar.kt:42:21 Type mismatch: inferred type is UTSArray<TreeNode>? but Boolean was expected
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/treeBar.kt:43:37 Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type Boolean?
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/treeBar.kt:50:25 Type mismatch: inferred type is UTSArray<TreeNode>? but Boolean was expected
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/treeBar.kt:51:25 Unresolved reference: initTreeData
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/treeBar.kt:57:46 Operator call corresponds to a dot-qualified call 'level.compareTo(2)' which is not allowed on a nullable receiver 'level'.
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/treeBar.kt:63:47 Operator call corresponds to a dot-qualified call 'level.times(30)' which is not allowed on a nullable receiver 'level'.
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/treeBar.kt:66:39 Operator call corresponds to a dot-qualified call 'level.compareTo(0)' which is not allowed on a nullable receiver 'level'.
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/treeBar.kt:71:51 Operator call corresponds to a dot-qualified call 'level.times(3)' which is not allowed on a nullable receiver 'level'.
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/treeBar.kt:74:24 Type mismatch: inferred type is UTSArray<TreeNode> but Unit was expected
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/treeBar.kt:76:19 Cannot infer a type for this parameter. Please specify it explicitly.
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/treeBar.kt:94:101 Type mismatch: inferred type is Boolean? but Boolean was expected
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/components/treeBar.kt:99:70 Type mismatch: inferred type is Boolean? but Boolean was expected
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/index.kt:153:11 Redeclaration: Detail
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/index.kt:191:79 Unresolved reference: GenUniModulesUniPopupComponentsUniPopupUniPopup
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/index.kt:192:59 Unresolved reference: GenUniModulesUniPopupComponentsUniPopupUniPopup
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/index.kt:192:128 Unresolved reference: GenUniModulesUniPopupComponentsUniPopupUniPopup
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/index.kt:192:199 Unresolved reference: GenUniModulesUniPopupComponentsUniPopupUniPopup
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/index.kt:192:263 Unresolved reference: GenUniModulesUniPopupComponentsUniPopupUniPopup
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/index.kt:192:338 Unresolved reference: GenUniModulesUniPopupComponentsUniPopupUniPopup
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/index.kt:192:413 Unresolved reference: GenUniModulesUniPopupComponentsUniPopupUniPopup
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/index.kt:192:481 Unresolved reference: GenUniModulesUniPopupComponentsUniPopupUniPopup
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/index.kt:192:550 Unresolved reference: GenUniModulesUniPopupComponentsUniPopupUniPopup
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/index.kt:194:28 Unresolved reference: GenUniModulesUniPopupComponentsUniPopupUniPopup
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/index.kt:195:12 Unresolved reference: GenUniModulesUniPopupComponentsUniPopupUniPopup
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/index.kt:263:11 Redeclaration: Detail
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/index.kt:266:11 Redeclaration: PickerChangeEvent
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/index.kt:290:11 Redeclaration: Detail
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/index.kt:293:11 Redeclaration: PickerChangeEvent
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/index.kt:424:11 Redeclaration: Detail
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/exam/answer_sheet.kt:93:42 A type annotation is required on a value parameter
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/exam/answer_sheet.kt:93:47 A type annotation is required on a value parameter
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/exam/exam.kt:100:33 A type annotation is required on a value parameter
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/exam/exam_record.kt:33:79 Unresolved reference: title
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/exam/exam_record.kt:34:79 Unresolved reference: sub
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/exam/exam_record.kt:35:79 Unresolved reference: score
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/exam/exam_record.kt:36:79 Unresolved reference: date
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/exam/start_exam.kt:140:22 Unresolved reference: popup
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/exam/wrong_ques.kt:29:168 Unresolved reference: type
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/exam/wrong_ques.kt:32:82 Unresolved reference: fenleis
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/exam/wrong_ques.kt:32:95 Cannot infer a type for this parameter. Please specify it explicitly.
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/exam/wrong_ques.kt:32:101 Cannot infer a type for this parameter. Please specify it explicitly.
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/exam/wrong_ques.kt:32:108 Cannot infer a type for this parameter. Please specify it explicitly.
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/exam/wrong_ques.kt:32:117 Cannot infer a type for this parameter. Please specify it explicitly.
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/home/home.kt:36:64 Unresolved reference: url
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/subject/order_subject.kt:60:31 A type annotation is required on a value parameter
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/subject/subject.kt:28:47 Unresolved reference: text
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/subject/subject.kt:31:124 Unresolved reference: url
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/subject/subject.kt:34:125 Unresolved reference: text
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/subject/subject.kt:117:32 A type annotation is required on a value parameter
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/subject/subject.kt:121:29 A type annotation is required on a value parameter
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/subject/subject_detal.kt:24:70 Unresolved reference: title
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/subject/subject_list.kt:18:23 Unresolved reference: type
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/subject/subject_list.kt:21:36 Unresolved reference: type
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/subject/subject_list.kt:116:34 Unresolved reference: scrollTop
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/userinfo/edit_touxiang.kt:64:22 Unresolved reference: popup
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/userinfo/user_zhongxin_birthday.kt:72:30 Unresolved reference: value
e: file://[PackagePath]/wgtRoot/UNI2207F5A/.uniappx/android/src/pages/userinfo/user_zhongxin_educational.kt:58:31 Unresolved reference: value  
FAILURE: Build failed with an exception.
- 
What went wrong:
Execution failed for task ':app:compileReleaseKotlin'.
> A failure occurred while executing org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction
> Compilation error. See log for more details - 
Try:
> Run with --debug option to get more log output.
> Run with --scan to get full insights.
> Get more help at https://help.gradle.org. - 
Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:compileReleaseKotlin'.
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:130)
at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:293)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:128)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:116)
at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74)
at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:42)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:331)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:318)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.lambda$execute$0(DefaultTaskExecutionGraph.java:314)
at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:85)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:314)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:303)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:459)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:376)
at org.gradle.execution.plan.DefaultPlanExecutor.process(DefaultPlanExecutor.java:111)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph.executeWithServices(DefaultTaskExecutionGraph.java:138)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph.execute(DefaultTaskExecutionGraph.java:123)
at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:35)
at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:51)
at org.gradle.execution.BuildOperationFiringBuildWorkerExecutor$ExecuteTasks.call(BuildOperationFiringBuildWorkerExecutor.java:54)
at org.gradle.execution.BuildOperationFiringBuildWorkerExecutor$ExecuteTasks.call(BuildOperationFiringBuildWorkerExecutor.java:43)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
at org.gradle.execution.BuildOperationFiringBuildWorkerExecutor.execute(BuildOperationFiringBuildWorkerExecutor.java:40)
at org.gradle.internal.build.DefaultBuildLifecycleController.lambda$executeTasks$10(DefaultBuildLifecycleController.java:313)
at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:266)
at org.gradle.internal.model.StateTransitionController.lambda$tryTransition$8(StateTransitionController.java:177)
at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:46)
at org.gradle.internal.model.StateTransitionController.tryTransition(StateTransitionController.java:177)
at org.gradle.internal.build.DefaultBuildLifecycleController.executeTasks(DefaultBuildLifecycleController.java:304)
at org.gradle.internal.build.DefaultBuildWorkGraphController$DefaultBuildWorkGraph.runWork(DefaultBuildWorkGraphController.java:220)
at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:263)
at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:127)
at org.gradle.composite.internal.DefaultBuildController.doRun(DefaultBuildController.java:181)
at org.gradle.composite.internal.DefaultBuildController.access$000(DefaultBuildController.java:50)
at org.gradle.composite.internal.DefaultBuildController$BuildOpRunnable.lambda$run$0(DefaultBuildController.java:198)
at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:85)
at org.gradle.composite.internal.DefaultBuildController$BuildOpRunnable.run(DefaultBuildController.java:198)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:48)
Caused by: org.gradle.workers.internal.DefaultWorkerExecutor$WorkExecutionException: A failure occurred while executing org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction
at org.gradle.workers.internal.DefaultWorkerExecutor$WorkItemExecution.waitForCompletion(DefaultWorkerExecutor.java:287)
at org.gradle.internal.work.DefaultAsyncWorkTracker.lambda$waitForItemsAndGatherFailures$2(DefaultAsyncWorkTracker.java:130)
at org.gradle.internal.Factories$1.create(Factories.java:31)
at org.gradle.internal.work.DefaultWorkerLeaseService.withoutLocks(DefaultWorkerLeaseService.java:335)
at org.gradle.internal.work.DefaultWorkerLeaseService.withoutLocks(DefaultWorkerLeaseService.java:318)
at org.gradle.internal.work.DefaultWorkerLeaseService.withoutLock(DefaultWorkerLeaseService.java:323)
at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForItemsAndGatherFailures(DefaultAsyncWorkTracker.java:126)
at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForItemsAndGatherFailures(DefaultAsyncWorkTracker.java:92)
at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForAll(DefaultAsyncWorkTracker.java:78)
at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForCompletion(DefaultAsyncWorkTracker.java:66)
at org.gradle.api.internal.tasks.execution.TaskExecution$3.run(TaskExecution.java:252)
at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
at org.gradle.api.internal.tasks.execution.TaskExecution.executeAction(TaskExecution.java:229)
at org.gradle.api.internal.tasks.execution.TaskExecution.executeActions(TaskExecution.java:212)
at org.gradle.api.internal.tasks.execution.TaskExecution.executeWithPreviousOutputFiles(TaskExecution.java:195)
at org.gradle.api.internal.tasks.execution.TaskExecution.execute(TaskExecution.java:162)
at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:105)
at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:44)
at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:59)
at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:56)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:56)
at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:44)
at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:42)
at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:75)
at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55)
at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:50)
at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:28)
at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:67)
at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:37)
at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:61)
at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:26)
at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:69)
at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:46)
at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:40)
at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:29)
at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:189)
at org.gradle.internal.execution.steps.BuildCacheStep.lambda$execute$1(BuildCacheStep.java:75)
at org.gradle.internal.Either$Right.fold(Either.java:175)
at org.gradle.internal.execution.caching.CachingState.fold(CachingState.java:62)
at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:73)
at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:48)
at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:46)
at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:35)
at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:75)
at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$2(SkipUpToDateStep.java:53)
at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:53)
at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:35)
at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37)
at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27)
at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:49)
at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:27)
at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:71)
at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:39)
at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:65)
at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:36)
at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:107)
at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:56)
at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:64)
at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:43)
at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.executeWithNonEmptySources(AbstractSkipEmptyWorkStep.java:125)
at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:61)
at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:36)
at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38)
at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:36)
at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:23)
at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:75)
at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:41)
at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.lambda$execute$0(AssignMutableWorkspaceStep.java:35)
at org.gradle.api.internal.tasks.execution.TaskExecution$4.withWorkspace(TaskExecution.java:289)
at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:31)
at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:22)
at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:40)
at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:23)
at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.lambda$execute$2(ExecuteWorkBuildOperationFiringStep.java:67)
at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:67)
at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:39)
at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:46)
at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:34)
at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:48)
at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:35)
at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:61)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:127)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:116)
at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74)
at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:42)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:331)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:318)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.lambda$execute$0(DefaultTaskExecutionGraph.java:314)
at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:85)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:314)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:303)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:459)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:376)
at org.gradle.execution.plan.DefaultPlanExecutor.process(DefaultPlanExecutor.java:111)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph.executeWithServices(DefaultTaskExecutionGraph.java:138)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph.execute(DefaultTaskExecutionGraph.java:123)
at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:35)
at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:51)
at org.gradle.execution.BuildOperationFiringBuildWorkerExecutor$ExecuteTasks.call(BuildOperationFiringBuildWorkerExecutor.java:54)
at org.gradle.execution.BuildOperationFiringBuildWorkerExecutor$ExecuteTasks.call(BuildOperationFiringBuildWorkerExecutor.java:43)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
at org.gradle.execution.BuildOperationFiringBuildWorkerExecutor.execute(BuildOperationFiringBuildWorkerExecutor.java:40)
at org.gradle.internal.build.DefaultBuildLifecycleController.lambda$executeTasks$10(DefaultBuildLifecycleController.java:313)
at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:266)
at org.gradle.internal.model.StateTransitionController.lambda$tryTransition$8(StateTransitionController.java:177)
at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:46)
at org.gradle.internal.model.StateTransitionController.tryTransition(StateTransitionController.java:177)
at org.gradle.internal.build.DefaultBuildLifecycleController.executeTasks(DefaultBuildLifecycleController.java:304)
at org.gradle.internal.build.DefaultBuildWorkGraphController$DefaultBuildWorkGraph.runWork(DefaultBuildWorkGraphController.java:220)
at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:263)
at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:127)
at org.gradle.composite.internal.DefaultBuildController.doRun(DefaultBuildController.java:181)
at org.gradle.composite.internal.DefaultBuildController.access$000(DefaultBuildController.java:50)
at org.gradle.composite.internal.DefaultBuildController$BuildOpRunnable.lambda$run$0(DefaultBuildController.java:198)
at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:85)
at org.gradle.composite.internal.DefaultBuildController$BuildOpRunnable.run(DefaultBuildController.java:198)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:48)
Caused by: org.jetbrains.kotlin.gradle.tasks.CompilationErrorException: Compilation error. See log for more details
at org.jetbrains.kotlin.gradle.tasks.TasksUtilsKt.throwExceptionIfCompilationFailed(tasksUtils.kt:22)
at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.run(GradleKotlinCompilerWork.kt:144)
at org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction.execute(GradleCompilerRunnerWithWorkers.kt:76)
at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:63)
at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:66)
at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:62)
at org.gradle.internal.classloader.ClassLoaderUtils.executeInClassloader(ClassLoaderUtils.java:100)
at org.gradle.workers.internal.NoIsolationWorkerFactory$1.lambda$execute$0(NoIsolationWorkerFactory.java:62)
at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:44)
at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:41)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209)
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
at org.gradle.workers.internal.AbstractWorker.executeWrappedInBuildOperation(AbstractWorker.java:41)
at org.gradle.workers.internal.NoIsolationWorkerFactory$1.execute(NoIsolationWorkerFactory.java:59)
at org.gradle.workers.internal.DefaultWorkerExecutor.lambda$submitWork$0(DefaultWorkerExecutor.java:174)
at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runExecution(DefaultConditionalExecutionQueue.java:194)
at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.access$700(DefaultConditionalExecutionQueue.java:127)
at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner$1.run(DefaultConditionalExecutionQueue.java:169)
at org.gradle.internal.Factories$1.create(Factories.java:31)
at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:263)
at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:127)
at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:132)
at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runBatch(DefaultConditionalExecutionQueue.java:164)
at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.run(DefaultConditionalExecutionQueue.java:133)
... 2 moreBUILD FAILED in 1m 36s
gradle build error: 1 
uniapp-x下的tab组件的简单实现
<view class="tablist flex-row flex-wrap justify-between">
<text class="item t-center" :class="{'active': selectTab == index}" v-for="(item, index) in tablist" @click="changeTab(index)">{{item}}</text>
</view>
<swiper :indicator-dots="false" :autoplay="false" :current="selectTab" @change="changeEvent">
<swiper-item v-for="(item, index) in tablist">
<view class="swiper-item">
{{item}}
</view>
</swiper-item>
</swiper>
const selectTab = ref(0)  
const tablist = ["内容1", "内容2", "内容3", "内容4"]  
const changeTab = (index: number)=>{  
    selectTab.value = index  
}  
const changeEvent = (event: UniSwiperChangeEvent)=>{  
    selectTab.value = event.detail.current  
}  
											<view class="tablist flex-row flex-wrap justify-between">
<text class="item t-center" :class="{'active': selectTab == index}" v-for="(item, index) in tablist" @click="changeTab(index)">{{item}}</text>
</view>
<swiper :indicator-dots="false" :autoplay="false" :current="selectTab" @change="changeEvent">
<swiper-item v-for="(item, index) in tablist">
<view class="swiper-item">
{{item}}
</view>
</swiper-item>
</swiper>
const selectTab = ref(0)  
const tablist = ["内容1", "内容2", "内容3", "内容4"]  
const changeTab = (index: number)=>{  
    selectTab.value = index  
}  
const changeEvent = (event: UniSwiperChangeEvent)=>{  
    selectTab.value = event.detail.current  
}  
																			        	收起阅读 »
								        											基于flutter3.32+window_manager仿mac/wins桌面版os
flutter3-winchat:最新版原创flutter3.32+dart3.8+getx+window_manager+reorderables桌面端仿macOS/windows风格os实例。毛玻璃虚化背景、桌面栅格布局模板、Dock菜单可拖拽排序、自定义JSON配置桌面/dock菜单。
实现技术
- 跨平台框架:Flutter3.32+Dart3.8
 - 窗口管理:window_manager^0.5.1
 - 路由/状态管理:get^4.7.2
 - 缓存服务:get_storage^2.1.1
 - 拖拽排序:reorderables^0.6.0
 - 图表组件:fl_chart^1.0.0
 - 托盘管理:system_tray^2.0.3
 
项目框架结构
> ### flutter3-macos桌面端os系统已经更新到我的原创作品集。
> flutter3.32+window_manager桌面端OS系统  
热文推荐
最新研发flutter3.27+bitsdojo_window+getx客户端仿微信聊天Exe应用
最新版Flutter3.32+Dart3.8跨平台仿微信app聊天界面|朋友圈
最新版uniapp+vue3+uv-ui跨三端短视频+直播+聊天【H5+小程序+App端】
原创uniapp+vue3+deepseek+uv-ui跨端实战仿deepseek/豆包流式ai聊天对话助手。
vue3-webseek网页版AI问答|Vite6+DeepSeek+Arco流式ai聊天打字效果
Electron35-DeepSeek桌面端AI系统|vue3.5+electron+arco客户端ai模板
uniapp+vue3聊天室|uni-app+vite4+uv-ui跨端仿微信app聊天语音/朋友圈
uniapp+vue3酒店预订|vite5+uniapp预约订房系统模板(h5+小程序+App端)
Electron32-Vue3OS桌面版os系统|vue3+electron+arco客户端OS管理模板
Tauri2.0+Vite5聊天室|vue3+tauri2+element-plus仿微信|tauri聊天应用
tauri2.0-admin桌面端后台系统|Tauri2+Vite5+ElementPlus管理后台EXE程序  
flutter3-winchat:最新版原创flutter3.32+dart3.8+getx+window_manager+reorderables桌面端仿macOS/windows风格os实例。毛玻璃虚化背景、桌面栅格布局模板、Dock菜单可拖拽排序、自定义JSON配置桌面/dock菜单。
实现技术
- 跨平台框架:Flutter3.32+Dart3.8
 - 窗口管理:window_manager^0.5.1
 - 路由/状态管理:get^4.7.2
 - 缓存服务:get_storage^2.1.1
 - 拖拽排序:reorderables^0.6.0
 - 图表组件:fl_chart^1.0.0
 - 托盘管理:system_tray^2.0.3
 
项目框架结构
> ### flutter3-macos桌面端os系统已经更新到我的原创作品集。
> flutter3.32+window_manager桌面端OS系统  
热文推荐
最新研发flutter3.27+bitsdojo_window+getx客户端仿微信聊天Exe应用
最新版Flutter3.32+Dart3.8跨平台仿微信app聊天界面|朋友圈
最新版uniapp+vue3+uv-ui跨三端短视频+直播+聊天【H5+小程序+App端】
原创uniapp+vue3+deepseek+uv-ui跨端实战仿deepseek/豆包流式ai聊天对话助手。
vue3-webseek网页版AI问答|Vite6+DeepSeek+Arco流式ai聊天打字效果
Electron35-DeepSeek桌面端AI系统|vue3.5+electron+arco客户端ai模板
uniapp+vue3聊天室|uni-app+vite4+uv-ui跨端仿微信app聊天语音/朋友圈
uniapp+vue3酒店预订|vite5+uniapp预约订房系统模板(h5+小程序+App端)
Electron32-Vue3OS桌面版os系统|vue3+electron+arco客户端OS管理模板
Tauri2.0+Vite5聊天室|vue3+tauri2+element-plus仿微信|tauri聊天应用
tauri2.0-admin桌面端后台系统|Tauri2+Vite5+ElementPlus管理后台EXE程序  
            
            
            







































