HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

【鸿蒙征文】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.utsindex.uts 的拆分导致函数重复声明或找不到定义的问题。通过将 method.uts 的内容合并到 index.uts 中解决了此问题。
  • Git 推送标签失败:在版本发布时,如果本地没有对应的 Git 标签,git push origin <tagname> 会失败。通过先执行 git tag <tagname> 创建本地标签,然后再推送解决。
  • 函数未定义错误:在页面中调用插件函数时,如果导入路径不正确或插件未正确导出函数,会导致 xxx is not defined 错误。仔细检查插件的 index.uts 导出逻辑和页面中的导入路径,确保一致。

如何使用 nutpi-idcard 插件

  1. 安装插件

    • 从 DCloud 插件市场安装。插件地址:https://ext.dcloud.net.cn/plugin?id=23728
    • 或者,如果手动引入,将 nutpi-idcard 整个文件夹复制到你的 uni-app 项目的 uni_modules 目录下。
  2. 引入插件:在需要使用的页面或组件的 <script setup lang="uts"><script lang="uts"> 中引入插件。

    // 示例:在页面的 <script setup lang="uts"> 中  
    import { parseID } from '@/uni_modules/nutpi-idcard'; // HBuilderX 会自动处理路径映射  
    // 如果在 uni-app x 项目的 .uvue 文件中,路径可能需要更明确,或者依赖 HBuilderX 的智能提示  
  3. 调用解析函数:使用 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,待实现详细校验逻辑)  
    }  

未来展望

  • 完善校验逻辑:实现更严格的身份证号码校验,包括校验码的计算与验证。
  • 更广泛的证件类型支持:考虑支持更多国家或地区的身份证件类型。
  • 性能优化:对数据查找和字符串处理进行优化,提高解析效率。
  • 更详细的错误提示:当输入格式错误或无法解析时,提供更具体的错误信息。
  • 单元测试:为插件编写完善的单元测试,确保代码质量和稳定性。

作者与联系方式

希望这个插件能对您有所帮助!如果您有任何问题或建议,欢迎联系。

相关链接

继续阅读 »

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.utsindex.uts 的拆分导致函数重复声明或找不到定义的问题。通过将 method.uts 的内容合并到 index.uts 中解决了此问题。
  • Git 推送标签失败:在版本发布时,如果本地没有对应的 Git 标签,git push origin <tagname> 会失败。通过先执行 git tag <tagname> 创建本地标签,然后再推送解决。
  • 函数未定义错误:在页面中调用插件函数时,如果导入路径不正确或插件未正确导出函数,会导致 xxx is not defined 错误。仔细检查插件的 index.uts 导出逻辑和页面中的导入路径,确保一致。

如何使用 nutpi-idcard 插件

  1. 安装插件

    • 从 DCloud 插件市场安装。插件地址:https://ext.dcloud.net.cn/plugin?id=23728
    • 或者,如果手动引入,将 nutpi-idcard 整个文件夹复制到你的 uni-app 项目的 uni_modules 目录下。
  2. 引入插件:在需要使用的页面或组件的 <script setup lang="uts"><script lang="uts"> 中引入插件。

    // 示例:在页面的 <script setup lang="uts"> 中  
    import { parseID } from '@/uni_modules/nutpi-idcard'; // HBuilderX 会自动处理路径映射  
    // 如果在 uni-app x 项目的 .uvue 文件中,路径可能需要更明确,或者依赖 HBuilderX 的智能提示  
  3. 调用解析函数:使用 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,待实现详细校验逻辑)  
    }  

未来展望

  • 完善校验逻辑:实现更严格的身份证号码校验,包括校验码的计算与验证。
  • 更广泛的证件类型支持:考虑支持更多国家或地区的身份证件类型。
  • 性能优化:对数据查找和字符串处理进行优化,提高解析效率。
  • 更详细的错误提示:当输入格式错误或无法解析时,提供更具体的错误信息。
  • 单元测试:为插件编写完善的单元测试,确保代码质量和稳定性。

作者与联系方式

希望这个插件能对您有所帮助!如果您有任何问题或建议,欢迎联系。

相关链接

收起阅读 »

【建议】建议uniapp x 增加 uni.preloadPage 预加载

uni_app x

有看到帖子官方觉得 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电脑端聊天应用

vite vue.js vue3

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聊天项目已经同步到我的原创作品集。

Electron38+Vue3+ElementPlus仿微信客户端聊天系统

热文推荐

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聊天项目已经同步到我的原创作品集。

Electron38+Vue3+ElementPlus仿微信客户端聊天系统

热文推荐

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程序

收起阅读 »

关于web-view使用高德地图

在uniapp x上,使用webview组件,内嵌一个html文件
我使用的是高德地图。

按照官方给出的文档设置。但是无法正常显示地图出来。
可以检查一下,ID元素有没有设置大小。
不要设置百分比%
建议设置PX单位 例如:width:750px;height:1500px;

继续阅读 »

在uniapp x上,使用webview组件,内嵌一个html文件
我使用的是高德地图。

按照官方给出的文档设置。但是无法正常显示地图出来。
可以检查一下,ID元素有没有设置大小。
不要设置百分比%
建议设置PX单位 例如:width:750px;height:1500px;

收起阅读 »

组件库示例已上传鸿蒙应用市场,欢迎大家下载体验

鸿蒙

组件库示例已上传鸿蒙应用市场,欢迎大家下载体验;
插件地址:https://ext.dcloud.net.cn/plugin?id=24907

组件库示例已上传鸿蒙应用市场,欢迎大家下载体验;
插件地址:https://ext.dcloud.net.cn/plugin?id=24907

阿里百川 旗舰版 UTS 插件:error: no such module 'AlibcTradeUltimateSDK'‌

uts插件

10:16:09.631 开始编译插件 xxx-baichuan
10:16:13.391 uts插件[xxx-baichuan]编译失败
10:16:13.391 ⁠‌error: no such module 'AlibcTradeUltimateSDK'‌

继续阅读 »

10:16:09.631 开始编译插件 xxx-baichuan
10:16:13.391 uts插件[xxx-baichuan]编译失败
10:16:13.391 ⁠‌error: no such module 'AlibcTradeUltimateSDK'‌

收起阅读 »

免费开源的uniappx UI框架,支持鸿蒙,APP,小程序,H5

UI

免费开源的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组件的简单实现

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

flutter

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程序

收起阅读 »