uniapp 原生插件开发 UI

news2024/12/23 7:17:09

前言:

        在集成某些特定 原生SDK的时候,它本身是带UI控件的。当我们使用 uniapp 开发app的时候实是 可以使使用 nvue 页面,以 weex 的方式嵌入原生的UI控件。

我这边的场景是 接入连连app的支付,它有个自己的密码键盘 控件是原生的页面。这里就需要用到 nvue 以 weex 的方式接入:

图中

        蓝色部分为 sdk 密码控件输入框,下面弹出的软键盘为 SDK 自带密码键盘; 函数为密码键盘SDK提供的函数

 官方文档解析:

查看官方文档:

开发者须知 | uni小程序SDK

public class TestText extends UniComponent<TextView>

只要继承 UniComponent 的控件 就可以了,但是这里有个插曲。 代码自动生成的 构造函数多了一个参数。造成框架初始化 weex 组件(原始组件)不成功 “ com.taobao.weex.common.xRuntimeException: can't find constructor of component”

 

///错误的 四个参数
public InputLianLian(UniSDKInstance instance, AbsVContainer parent, int type, AbsComponentData componentData) {
    super(instance, parent, type, componentData);
}

///正确的 三个参数
public InputLianLian(UniSDKInstance instance, AbsVContainer parent, AbsComponentData componentData) {
    super(instance, parent, componentData);
    AbsAttr attr = componentData.getAttrs();
    aesKey = (String) attr.get("aesKey");
    rasKey = (String) attr.get("rsaPublic");
}

  在 initComponentHostView 中返回你的控件就可以了

@Override
protected PassGuardEdit initComponentHostView(@NonNull Context context) {
    inputEditText = new PassGuardEdit(context, null);
    inputEditText.setButtonPress(true);
    if ((aesKey != null && aesKey.length() > 0) && (rasKey != null && rasKey.length() > 0)) {
        inputEditText.setCipherKey(aesKey);
        inputEditText.setPublicKey(rasKey);
    }
    inputEditText.needScrollView(false);
    inputEditText.setButtonPressAnim(true);
    //6-12位的字母、数字,不可以是连续或者重复的数字和字母
    inputEditText.setInputRegex("[a-zA-Z0-9]{1,12}");
    //inputEditText.setInputRegex("[0-9]{1,6}");
    inputEditText.setClip(false);
    inputEditText.setMaxLength(12);//12位
    //inputEditText.useNumberPad(true);//纯数字
    inputEditText.setWatchOutside(true);
    inputEditText.initPassGuardKeyBoard();
    return inputEditText;
}

 上手实操:

        如果你是云打包,那么就需要把插件写成 模块库 的方式开发。方便导出 .aar库 给其他程序使用 。如果你是本地打包 那么直接写就好了。我这边是云打包,开发的时候 是本地跑的方式。 

 

脚本依赖:

        因为我们 是以 库的方式开发的,本身工程文件最好不好防止三方依赖库。我们都依赖 主应用的三方库;

. InputLianLian.java  完整控件脚本

package com.john.bridge.component;
import android.content.Context;
import androidx.annotation.NonNull;
import cn.passguard.PassGuardEdit;
import io.dcloud.feature.uniapp.UniSDKInstance;
import io.dcloud.feature.uniapp.annotation.UniJSMethod;
import io.dcloud.feature.uniapp.bridge.UniJSCallback;
import io.dcloud.feature.uniapp.dom.AbsAttr;
import io.dcloud.feature.uniapp.ui.action.AbsComponentData;
import io.dcloud.feature.uniapp.ui.component.AbsVContainer;
import io.dcloud.feature.uniapp.ui.component.UniComponent;

public class InputLianLian extends UniComponent<PassGuardEdit> {
    private PassGuardEdit inputEditText;
    private String aesKey;
    private String rasKey;

public InputLianLian(UniSDKInstance instance, AbsVContainer parent, AbsComponentData componentData) {
    super(instance, parent, componentData);
    AbsAttr attr = componentData.getAttrs();
    aesKey = (String) attr.get("aesKey");
    rasKey = (String) attr.get("rsaPublic");
}

@Override
protected PassGuardEdit initComponentHostView(@NonNull Context context) {
    inputEditText = new PassGuardEdit(context, null);
    inputEditText.setButtonPress(true);
    if ((aesKey != null && aesKey.length() > 0) && (rasKey != null && rasKey.length() > 0)) {
        inputEditText.setCipherKey(aesKey);
        inputEditText.setPublicKey(rasKey);
    }
    inputEditText.needScrollView(false);
    inputEditText.setButtonPressAnim(true);
    //6-12位的字母、数字,不可以是连续或者重复的数字和字母
    inputEditText.setInputRegex("[a-zA-Z0-9]{1,12}");
    //inputEditText.setInputRegex("[0-9]{1,6}");
    inputEditText.setClip(false);
    inputEditText.setMaxLength(12);//12位
    //inputEditText.useNumberPad(true);//纯数字
    inputEditText.setWatchOutside(true);
    inputEditText.initPassGuardKeyBoard();
    return inputEditText;
}

    @UniJSMethod
    public void initEditText(String aesKey, String rasKey) {
        if ((aesKey != null && aesKey.length() > 0) && (rasKey != null && rasKey.length() > 0)) {
            inputEditText.setCipherKey(aesKey);
            inputEditText.setPublicKey(rasKey);
            inputEditText.initPassGuardKeyBoard();
        }
    }

    @UniJSMethod(uiThread = true)
    public void getInputMD5(UniJSCallback callback) {
        if (callback != null && inputEditText != null) {
            callback.invoke(inputEditText.getMD5());
        }
    }

    @UniJSMethod(uiThread = true)
    public void getInputLength(UniJSCallback callback) {
        if (callback != null && inputEditText != null) {
            callback.invoke(inputEditText.getLength());
        }
    }

    @UniJSMethod(uiThread = true)
    public void getInputRSAAES(UniJSCallback callback) {
        if (callback != null && inputEditText != null) {
            callback.invoke(inputEditText.getRSAAESCiphertext ());
        }
    }
}
配置 weex 控件 dcloud_uniplugins.json

        因为 uniapp 是通过我们这个配置表 来加载 weex 控件的;要么通过代码的方式也是可以的,这里两张都介绍下。应为你要告诉你的 主APP 你都有哪些 自定义的 weex 控件:

配置文件:
代码的方式:

基本上差不多了,已经跑起来了

 

我们再来看  .nvue 的页面

  组件 inputLianLian 直接使用,方法调用,以及参数传值。

<template>
	<div class="mian">
		<div>
			<!-- 直接传入 aesKey rasKey 初始化控件 -->
			<inputLianLian ref='inputLianLian' :aesKey="aesKey" :rasKey="rasKey"
				style="width:690rpx;height:120rpx;background-color: aqua;">
			</inputLianLian>

			<div @click="getMD5()" style="width: 200;height: 80rpx; background-color: azure;">getMD5</div>
			<div @click="getLength()" style="width: 200;height: 80rpx;background-color:bisque;">getLength</div>
			<div @click="getLInputAESCode()" style="width: 200;height: 80rpx;background-color:coral;">getLInputAESCode
			</div>
			<div @click="initLianLian()" style="width: 200;height: 80rpx;background-color:darkgray;">initLianLian</div>
		</div>
	</div>
</template>

<script>
	import md5 from 'uview-ui/libs/function/md5';
	export default {
		data() {
			return {
				aesKey: '26999721009008604284404453805522',
				rasKey: '3081890281810092D9D8D04FB5F8EF9B8374F21690FD46FDBF49B40EECCDF416B4E2AC2044B0CFE3BD67EB4416B26FD18C9D3833770A526FD1AB66A83ED969AF74238D6C900403FC498154EC74EAF420E7338675CAD7F19332B4A56BE4FF946B662A3C2D217EFBE4DC646FB742B8C62BFE8E25FD5DC59E7540695FA8B9CD5BFD9F92DFAD009D230203010001'
			}
		},
		methods: {
			///二次初始化,刚进来拿不到初始化参数 参数情况下 ,
			///如果输入框不能二次初始化,等待拿到数据再展示
			initLianLian() {
				this.$refs.inputLianLian.initEditText('aesKey', 'rasKey');
			},
			async getMD5() {
				this.$refs.inputLianLian.getInputMD5((md5) => {
					uni.showToast({
						title: `md5:${md5}`,
						duration: 3000
					});
				});

				const md5 = await getInputMD5();
				uni.showModal({
					content: `md5:${md5}`,
				})
			},
			getLength() {
				this.$refs.inputLianLian.getInputLength((length) => {
					uni.showToast({
						title: `length:${length}`,
						duration: 3000
					});
				});
			},
			getLInputAESCode() {
				this.$refs.inputLianLian.getInputRSAAES((code) => {
					uni.showToast({
						title: `code:${code}`,
						duration: 3000
					});
				});
			},
			getInputMD5() {
				return new Promise((resolve, reject) => {
					try {
						this.$refs.inputLianLian.getInputMD5((md5) => {
							console.log('onMD5:', md5)
							resolve(md5);
						})
					} catch (ex) {
						console.log('onMD5 error:', ex)
						//reject('')
						resolve('');
					}
				});
			}
		}
	}
</script>

<style>
	.mian {
		display: flex;
		flex-direction: column;
		align-items: center;
	}
</style>
设置weex脚本 不混淆

因为 weex 加载是通过,反射的方式加载的。如果脚本混淆了,脚本的配置文件就对应不上了

导出 .aar 给云打包使用:

这里我们需要工程 导出为 .aar

 

在uniapp中设置 原生插件: 主要两个目录:

 ---android       放置 .aar

     --- libs         放置 .jar  和 对应的 .so ; .so 文件按照 CPU 目录放置

 

插件描述文件 : 和 上面的 dcloud_uniplugins.json 有点像

 

配置没有错误:这里就能展示出来了

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

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

相关文章

好用的电脑录屏软件有哪些?推荐4款专业工具。

不同系统的电脑上面带有的录屏功能不一样&#xff0c;比如win10上面有Xbox game bar,Mac系统则用的是QuickTime Player&#xff0c;或者是使用快捷键“CommandShift5”。但更方便的&#xff0c;我自己认为是使用一些专业的录屏软件&#xff0c;他门的录制模式多&#xff0c;兼容…

python将这多个sheet页的数据合并在一起

有如下数据&#xff0c;需要将excel多个sheet页中的数据&#xff0c;合并在一起。 数据样例&#xff1a;&#x1f447; import pandas as pd import os# 读Excel文件 file_path D:/project/Excelimport/簿4.xlsx# 创建空的DataFrame用于存储合并后的数据 all_data pd.Data…

软件项目管理

1. 软件项目管理概述 1.1 软件项目管理 软件项目管理的提出是在20世纪70年代中期&#xff0c;当时美国国防部专门研究了软件开发不能按时提交、预算超支和质量达不到用户要求的原因&#xff0c;发现70%的项目是因为管理不善引起的&#xff0c;而非技术原因。 软件项目管理和…

9月17–20日Sui新加坡参会指南,期待与您相聚

&#x1f4e7;叮&#xff0c;您有一份Sui新加坡参会指南待领取&#xff5e; 随着新加坡Token2049大会的临近&#xff0c;我们为即将前往新加坡参会的朋友们准备了一份指南&#xff0c;帮助你快速了解Sui团队的活动安排&#xff0c;并与Sui团队来个线下面对面的交流。 9月17日…

解码消费医疗机构:如何通过全场景AI运营实现营销破局?

在当今的医美市场中&#xff0c;“流量困境”已成为众多消费医疗机构面临的严峻挑战。传播日益碎片化&#xff0c;各大机构对流量争夺也愈演愈烈&#xff0c;不少机构面临着新客获取难、老客户留存转化难、运营成本高昂等困境。 那么&#xff0c;面对这一挑战&#xff0c;消费…

Leetcode面试经典150题-79.搜索单词

题目比较简单&#xff0c;回溯最基础的题&#xff0c;记得除非覆盖&#xff0c;否则一定要恢复现场就行 解法都在代码里&#xff0c;不懂就留言或者私信 class Solution {public boolean exist(char[][] board, String word) {int m board.length; int n board[0].length;i…

Baumer工业相机堡盟工业相机如何通过BGAPI SDK设置相机的图像剪切(ROI)功能(C语言)

Baumer工业相机堡盟工业相机如何通过BGAPI SDK设置相机的图像剪切&#xff08;ROI&#xff09;功能&#xff08;C语言&#xff09; Baumer工业相机Baumer工业相机的图像剪切&#xff08;ROI&#xff09;功能的技术背景CameraExplorer如何使用图像剪切&#xff08;ROI&#xff0…

公司搬迁至外地:选择新办资质还是迁移资质?

当企业面临搬迁&#xff0c;尤其是跨区域搬迁时&#xff0c;资质管理成为企业运营策略中的一个关键议题。企业需要在新办资质和迁移资质之间做出选择&#xff0c;这关系到企业的合规性、市场竞争力和业务连续性。本文将探讨这两种选择的考量因素&#xff0c;以及如何根据企业的…

cityengine修改纹理创建模型

数据准备 1、建筑shp面数据 2、安装好cityengine软件 3、Arcgis(非必要) 效果 1、新建工程 路径不要放C盘下 2、复制规则文件和纹理 安装软件后,这些素材在电脑上能找到,默认位置是:C:\Users{计算机名}\Documents\CityEngine\Default Workspace\ESRI.lib,如果找不到…

售后质保卡小程序系统开发制作方案

售后质保卡小程序系统作为一种数字化解决方案&#xff0c;通过微信小程序&#xff0c;为顾客提供更加便捷、高效、环保的质保服务体验。售后质保卡系统是集质保信息查询、报修申请、服务进度跟踪、顾客反馈等功能于一体的质保卡小程序。 目标顾客 1. 终端顾客&#xff1a;直接…

昇思MindSpore AI框架MindFormers实践3:ChatGLM3-6B对一段文字进行提取

MindSpore和MindFormers安装参见&#xff1a;昇思AI框架实践1:安装MindSpoe和MindFormers_miniconda 安装mindspore-CSDN博客 使用了MindSpore2.2和MindFormers1.0 支持的模型&#xff1a; KeyError: "model must be in odict_keys([gpt2, gpt2_lora, gpt2_xl, gpt2_xl…

Linux:开源世界的璀璨明珠

一、Linux 概述 Linux 是一种自由和开放源代码的类 Unix 操作系统&#xff0c;诞生于 1991 年&#xff0c;由芬兰大学生 Linus Torvalds 开发。它的起源离不开 Unix 家族&#xff0c;1969 年肯・汤普森设计了早期 Unix 的源头&#xff0c;到 1973 年丹尼斯・里奇等人以 C 语言…

基于多种智能优化算法优化BP神经网络的数据回归预测

基于多种智能优化算法优化BP神经网络的数据回归预测&#xff0c;主要是指通过引入一些优化算法来改进传统的BP&#xff08;反向传播&#xff09;神经网络的训练过程&#xff0c;以提高其在回归预测任务中的性能。以下是这个过程的基本原理&#xff1a; 代码原理及流程 1. BP神…

Java的发展史与前景

&#x1f308;个人主页&#xff1a;Yui_ &#x1f308;Linux专栏&#xff1a;Linux &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;数据结构专栏&#xff1a;数据结构 &#x1f308;C专栏&#xff1a;C 文章目录 0. Java语言的发展史1.概述1.1 什么是Java1.2 …

k8s 中的 Service 简介

前言 k8s 集群中的每一个 Pod 都有自己的 IP 地址&#xff0c;那么是不是有 IP 了&#xff0c;访问起来就简单了呢&#xff0c;其实不然。 因为在 k8s 中 Pod 不是持久性的&#xff0c;摧毁重建将获得新的 IP&#xff0c;客户端通过会变更 IP 来访问显然不合理。另外 Pod 还经…

JavaScript --函数作用域变量的使用规则(局部和访问)

访问规则&#xff0c;就近原则 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"w…

江西金融发展集团通过ZStack Zaku容器云推进数字化转型

江西金融发展集团选择ZStack Zaku容器云平台作为其数字化转型的关键技术支撑&#xff0c;以期构建一个创新的金融服务平台&#xff0c;实现业务流程的自动化和智能化&#xff0c;同时推出符合市场需求的新型金融产品。 产融结合综合金融服务集团 江西金融发展集团股份有限公司…

延迟退休,程序员的你准备好了吗?

随着社会的进步&#xff0c;人们的寿命也逐渐延长&#xff0c;65岁被认为是人们应该退休的年龄。然而&#xff0c;对于那些已经经历了35岁危机的程序员来说&#xff0c;65岁依然让他们感觉年轻。 在这种情况下&#xff0c;该如何应对已板上钉钉的延迟退呢&#xff1f;本文将探…

OZON电子产品大幅增长,OZON跨境PS5销量激增

Top1 存储卡 Карта памяти Canvas Select Plus 128 ГБ 商品id&#xff1a;1548303593 月销量&#xff1a;2131 欢迎各位卖家朋友点击这里&#xff1a; &#x1f449; D。DDqbt。COm/74rD 免费体验 随着智能手机和平板电脑的普及&#xff0c;用户对于存储空…

C++模拟实现priority_queue(仿函数)

目录 优先级队列仿函数 优先级队列 优先队列是一种容器适配器&#xff0c;根据严格的弱排序标准&#xff0c;它的第一个元素总是它所包含的元素中最大的。类似于堆&#xff0c;在堆中可以随时插入元素&#xff0c;并且只能检索最大堆元素(优先队列中位于顶部的元素) 学习优先级…