当前位置: 首页 > news >正文

【reactNative混合安卓开发~使用问题持续更】

reactNative混合安卓开发

  • reactNative开发移动端
    • reactNative界面开发
      • 前端init.bat文件部分组件
      • 第三方组件解析
        • 1、定义theme主题@shopify/restyle;菜单导航@react-navigation/drawer、@react-navigation/native;
    • RN问题记录
      • 1、使用theme.js写的公共组件报错(funcMap[props] undefined)
      • 2、安装react-native-reanimated后运行yarn android启动程序报错

reactNative开发移动端

用reactNative(VsCode编译器)开发移动端界面,Android开发后端接口(Android Studio编译器)。
RN官网(搭建环境于API手册):https://reactnative.cn/docs/environment-setup

reactNative界面开发

背景: reactNative提供组件,或者使用第三方库提供的组件,数据(包含规则校验)由 yup、formik提供,除启动界面:login,register,splash等账户登录后,一般使用导航栏(@react-navigation/drawer、‘npm install react-native-gesture-handler react-native-reanimated’)包含抽屉(Drawer Navigator)、tab切换(Bottom Tabs Navigator)进行路由导航(一般适用于简单页面切换),详情API请看https://reactnavigation.org/docs/drawer-navigator
RN前端开发技巧:
1\写了一系列组件或者网上推荐好用的组件放到component文件夹下,每个组件用export default xxx;【其他界面也可以加default】,定义index.ts放在component文件夹下,index.ts中写各个组件的export {default as Header} from "./Header";,集中一起导出,使用时在界面中引入import { theme, Box, Text, Header, LableValueInput, Error, Loading, ConfirmModal, } from '~/component';
例如: index.ts 其他界面也可以借鉴index.ts的思路

export {default as Container} from "./Container";
export {default as Footer} from "./Footer";
export {default as Button} from "./Button";
export {default as theme,Text,Box} from "./Theme";
export {default as RoundedIcon} from "./RoundedIcon";
export {default as Header} from "./Header";export {default as TextInput, } from "./Form/TextInput";
export {default as TextInputRightBtn} from "./Form/TextInputRightBtn";
export {default as LableValueInput} from "./Form/LableValueInput";
export {default as CusCheckbox} from "./Form/CusCheckbox";export { AuthContext} from "./context/AuthContext";
export { UserContext} from "./context/UserContext";
export { default as Loading} from "./Loading";
export { default as Error} from "./Error";
// export { default as IDCard0} from "./IDCard0";
// export { default as Tabs} from "./Tabs";
// export { default as UpgradeAppModel} from "./UpgradeAppModel";
export { default as ConfirmModal} from "./ConfirmModal";

前端init.bat文件部分组件

rem 界面基础组件
yarn add react-native
yarn add @ant-design/react-nativerem  界面数据(formik)与表单验证(Yup验证规则)
npm install yup
npm install formikrem 统一样式模板
yarn add @shopify/restylerem 其他组件(第三方)
yarn add react-native-keyboard-aware-scroll-view
rem 菜单导航栏
yarn add @react-navigation/drawer
yarn add @react-navigation/native
yarn add react-native-gesture-handler react-native-reanimated

第三方组件解析

1、定义theme主题@shopify/restyle;菜单导航@react-navigation/drawer、@react-navigation/native;

(1)实现修改少量参数切换主题api文档地址:https://github.com/Shopify/restyle
(2)navigation相关文档,可配合context使用上下文和hook进行数据传递和接口调用,刺激界面刷新(需要搜索案例)
https://reactnavigation.org/docs/drawer-navigator
使用:
在navigation界面或者app.js中定义<ThemeProvider theme={theme}></ThemeProvider>,颜色可取 theme.themecolors.primary等等。

import { createDrawerNavigator } from '@react-navigation/drawer';
import { NavigationContainer } from '@react-navigation/native';import {ThemeProvider,createBox,createText,createRestyleComponent,createVariant,VariantProps,} from '@shopify/restyle';import theme from '~/component/Theme';
const Drawer = createDrawerNavigator();
export default function XXXDrawerNavigator() {return (<ThemeProvider theme={theme}><NavigationContainer><Drawer.Navigator initialRouteName="Home" otherProps...><Drawer.Screen name="Home" component={HomeScreen}   options={{title: 'XXX配置',otherProps...,}}></Drawer.Screen><Drawer.Screen name="Notifications" component={NotificationsScreen}   options={{title: 'XXX分析',drawerIcon: ({focused, size}) => (<Ioniconsname="checkmark-circle-outline"size={size}color={focused ? '#7cc' : '#ccc'}/>),}}></Drawer.Screen></Drawer.Navigator></NavigationContainer></ThemeProvider>
}

RN问题记录

1、使用theme.js写的公共组件报错(funcMap[props] undefined)

原因:import @shopify/restyle没有定义 <ThemeProvider theme={theme}></ThemeProvider>
解决方式:在根页面定义<ThemeProvider theme={theme}><ThemeProvider>,或单独使用的页面也要加这个。
案例如下
描述: 导航页TCPZDrawerNavigator.js引入ThemeProvider标签;使用页面YDLXDTList.js应用组件LableValueInput;定义公共组件LableValueInput.js(使用了@shopify/restyle、theme)
使用公共组件和统一样式:代码只包含使用公用组件LableValueInput用法,样式部分可能会报错,需要修改

import React, { useState } from 'react';
import * as Yup from 'yup';
import { Formik, useFormik, useField } from 'formik';
// 原生接口
import { YDLXDTService, RunActivity } from '~/native/nativeModules';
import {Container,Button,Box,CusCheckbox,Header,UserContext,LableValueInput,ConfirmModal, Error} from  '~/components'//模板校验规则
const ydlxdtSchema = Yup.object().shape({mc: Yup.string()// 只能输入数字、字母、汉字.matches( /^[\da-zA-Z\u4E00-\u9FA5]+$/u,'图层名称存在违规字符,请重新输入!').required('图层名称必填'),lx: Yup.string().matches( /^[\da-zA-Z_\u4E00-\u9FA5\-.]+$/u,'矢量数据类型存在违规字符,请重新输入!'),address: Yup.string().matches( /^[\da-zA-Z_\u4E00-\u9FA5\-.]+$/u,'详细地址存在违规字符,请重新输入!').required('详细地址必填'),dh: Yup.string().matches( /^[\da-zA-Z_\u4E00-\u9FA5\-.]+$/u,'地号存在违规字符,请重新输入!'),zValue: Yup.string().matches( /^[\da-zA-Z\u4E00-\u9FA5]+$/u,'证书编号的字存在违规字符,请重新输入!').required('证书编号的字必填'),hValue: Yup.string().matches( /^[\da-zA-Z\u4E00-\u9FA5]+$/u,'证书编号的号存在违规字符,请重新输入!').required('证书编号的号必填'),syqmj: Yup.number(),page: Yup.number().min(1),});export function YDLXDTList()  {
// 这里有其他定义的let [ydlxdt, setYdlxdt] = React.useState({});
const    { handleChange, handleBlur, handleSubmit, errors,touched,values,setFieldValue,setValues }=useFormik({validationSchema:ydlxdtSchema,initialValues: {tcid: ydlxdt?.tcid,xh: ydlxdt && ydlxdt.xh ? ydlxdt.xh : "",mc:ydlxdt &&  ydlxdt.mc?ydlxdt.mc:"",lx: ydlxdt && ydlxdt.lx?ydlxdt.lx:"",fz:ydlxdt && ydlxdt.fz?ydlxdt.fz:"",fzxh:ydlxdt && ydlxdt.fzxh ?ydlxdt.fzxh :'',tbzt:ydlxdt && ydlxdt.tbzt?ydlxdt.tbzt:"是",tbsj:ydlxdt && ydlxdt.tbsj?ydlxdt.tbsj:"",sfdt:ydlxdt && ydlxdt.sfdt? ydlxdt.sfdt:"",sfnbcc :ydlxdt &&  ydlxdt.sfnbcc? ydlxdt.sfnbcc:"",minScale: ydlxdt &&  ydlxdt.minScale?ydlxdt.minScale:"",maxScale: ydlxdt &&  ydlxdt.maxScale?ydlxdt.maxScale:"",sfjz: ydlxdt &&  ydlxdt.sfjz?ydlxdt.sfjz:"",ipaddress:ydlxdt?.ipaddress,sfquery: ydlxdt?.sfquery,sfzyfx: ydlxdt?.sfzyfx},onSubmit: values => {console.log('onsubmit');debugger;console.log(values);// 处理 每个字段是否包含敏感词,并直接替换为空handleSensitiveWord(values);
dataHandle.qzxx_save(userData.token,values,saveQzxxCallBack,refreshQZXXState);     },});return (
<SafeAreaView style={styles.container}><Loading loading={loading}></Loading><LableValueInputlabelName="权利人"placeholder="请输入权利人"value={values.qlrxm}onChangeText={handleChange('qlrxm')}onBlur={handleBlur('qlrxm')}error={errors.qlrxm}touched={touched.qlrxm}borderBottomColor="text2"labelTextCss={styles.labelTextCss}style={styles.valueText}/>
</SafeAreaView>
)}

定义LableValueInput组件

import React, { useState,forwardRef } from "react";
import {View,StyleSheet,TextInput } from "react-native";
import Icon from 'react-native-vector-icons/Ionicons';
import theme,{ Box,Text} from "../Theme";
import RoundedIcon from "../RoundedIcon";const  SIZE= theme.borderRadii.m*2;const LableValueInput = forwardRef(({labelName,touched,error,borderBottomColor,labelTextCss,...props},ref)=>{debugger;const reColor = !touched ? "text2" : error ? "danger" : "primary";const color=theme.colors[reColor];return (<Box  flexDirection="row" alignItems = "center" borderBottomWidth={StyleSheet.hairlineWidth}{...{borderBottomColor}}><Text style={labelTextCss}>{labelName}</Text><TextInput underlineColorAndroid="transparent" flex={1}placeholderTextColor={color}{...{ref}}{...props}/>{(touched) && (<RoundedIconname={!error?"ios-checkmark":"ios-close"}size={SIZE}backgroundColor={!error?"primary":"danger"}color="white" />)}</Box>)
})
export default  LableValueInput;

导航页面TCPZDrawerNavigator.js引用theme、@shopify/restyle

import * as React from 'react';
import { Button, View } from 'react-native';
import { createDrawerNavigator } from '@react-navigation/drawer';
import { NavigationContainer } from '@react-navigation/native';import HomeScreen from '~/module/screens/tcpz/HomeScreen';
import LxdtScreen from '~/module/screens/xmhc/YDLXDTList';
import Ionicons from 'react-native-vector-icons/Ionicons';
import MaterialIcons from 'react-native-vector-icons/MaterialIcons';import {GEONavigator} from '~/module/navigators/GEONavigator';
import {YDLXDTNavigator} from '~/module/navigators/YDLXDTNavigator';import CustomerDrawer from '~/module/navigators/CustomerDrawer';
import {ThemeProvider,createBox,createText,createRestyleComponent,createVariant,VariantProps,} from '@shopify/restyle';import theme from '~/component/Theme';
const Drawer = createDrawerNavigator();
const focused='#7cc';
const size = 22;
// 图层配置菜单
export default function TCPZDrawerNavigator() {return (<ThemeProvider theme={theme}><NavigationContainer><Drawer.Navigator initialRouteName="Home"  screenOptions={{headerShown:true,drawerActiveBackgroundColor:'#7cc',drawerActiveTintColor:'#fff', drawerInactiveTintColor:'#333', drawerLabelStyle:{marginLeft:-25,fontFamily:'Roboto-Medium',fontSize:15}}} drawerContent={props =><CustomerDrawer {...props} />}><Drawer.Screen name="Home" component={HomeScreen}   options={{title: '图层配置',drawerIcon: ({focused, size}) => (<Ioniconsname="globe-outline"size={size}color={focused ? '#7cc' : '#ccc'}/>),}}></Drawer.Screen><Drawer.Screen name="YDLXDTNavigator" component={YDLXDTNavigator}   options={{title: '离线地图',drawerIcon: ({focused, size}) => (<MaterialIconsname="workspaces-outline"size={size}color={focused ? '#7cc' : '#ccc'}/>),}}/><Drawer.Screen name="GEONavigator" component={GEONavigator}   options={{title: 'Geo',drawerIcon: ({focused, size}) => (<MaterialIconsname="workspaces-outline"size={size}color={focused ? '#7cc' : '#ccc'}/>),}}/></Drawer.Navigator></NavigationContainer></ThemeProvider>);
}

2、安装react-native-reanimated后运行yarn android启动程序报错

解决方案:在本地 babel.config.js添加Reanimated’s babel plugin

  module.exports = {presets: [...],plugins: [...'react-native-reanimated/plugin',],};

在添加react-native-reanimated/plugin后,你可能会遇到"Reanimated 2 failed to create a worklet" error,需要清除应用缓存,可以执行命令yarn start --reset-cache
npm start -- --reset-cache
expo start -c

相关文章:

【reactNative混合安卓开发~使用问题持续更】

reactNative混合安卓开发 reactNative开发移动端reactNative界面开发前端init.bat文件部分组件第三方组件解析1、定义theme主题shopify/restyle&#xff1b;菜单导航react-navigation/drawer、react-navigation/native&#xff1b; RN问题记录1、使用theme.js写的公共组件报错&…...

OCR的发明人是谁?

OCR的发明背景可以追溯到早期计算机科学和图像处理的研究。随着计算机技术的不断发展&#xff0c;人们开始探索如何将印刷体文字转换为机器可读的文本。 OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;的发明涉及多个人的贡献&#xff0c…...

笔记本电脑连上WiFi之后的IP为什么会变?如何让它不变固定住?

笔记本连上WiFi后获取IP地址的过程&#xff0c;通常是通过DHCP (动态主机配置协议) 来完成的。默认情况下&#xff0c;DHCP会根据连接设备和网络状态动态地分配IP地址&#xff0c;因此你会看到IP地址可能经常改变。 如果你希望电脑的IP地址固定&#xff0c;可以尝试设置静态IP…...

【数学建模】--因子分析模型

因子分析有斯皮尔曼在1904年首次提出&#xff0c;其在某种程度上可以被看成时主成分分析的推广和扩展。 因子分析法通过研究变量间的相关稀疏矩阵&#xff0c;把这些变量间错综复杂的关系归结成少数几个综合因子&#xff0c;由于归结出的因子个数少于原始变量的个数&#xff0c…...

RAM不够?CUBEIDE使用CCMRAM

RAM不够&#xff1f;使用CCMRAM 文章目录 RAM不够&#xff1f;使用CCMRAM打开连接LD文件&#xff1a;添加代码添加标识宏使用 打开连接LD文件&#xff1a; 添加代码 在SECTIONS段最后加上下面代码&#xff1a; _siccmram LOADADDR(.ccmram); /* CCM-RAM section * * IMPORTAN…...

npm ERR! code ERESOLVEnpm ERR! ERESOLVE unable to resolve dependency tree

拉取项目到本地 执行 npm install 报错 遇到这个问题首先确认的就是版本是不是太高了&#xff0c;降一下版本。或者通过yarn命令替代npm install命令安装&#xff0c;同理&#xff0c;启动也可以采用yarn dev 启动代替npm run dev 下面教大家用一个NVM工具&#xff0c;这个工…...

使用 prometheus client SDK 暴露指标

目录 1. 使用 prometheus client SDK 暴露指标1.1. How Go exposition works1.2. Adding your own metrics1.3. Other Go client features 2. Golang Application monitoring using Prometheus2.1. Metrics and Labels2.2. Metrics Types2.2.1. Counters:2.2.2. Gauges:2.2.3. …...

Jmeter之BeanShell取出参数进行四则运算,并判断是否正确

首先调用余额接口&#xff0c;使用正则提取响应中的余额字段&#xff0c;记作变量acctBal1做支付交易再次调用余额接口&#xff0c;使用正则提取响应中的余额字段&#xff0c;记作变量acctBal2最后在结果树中可以看到断言错误的信息&#xff0c;断言正确时没有提示以下是beansh…...

PYTHON 斗地主发牌 (简易版)

利用方法&#xff1a; 1. random.randint( ) 随机抽取数字 方法 2.random.sample((抽取范围的参数),(抽取的个数)) 返回的是列表 所以用[0]可以输出里面的元素 import random# 1. 创建牌 # 花色 color ["\u2660", "\u2663", "\u2665", "\…...

CSS文本裁剪

对于单行文本裁剪&#xff1a; span {text-overflow:ellipsis;white-space:nowrap;overflow:hidden;display:block; } 对于多行文本裁剪&#xff1a; 在文本容器上定义 CSS Flexbox 属性 display: -webkit-box; 定义要显示的文本行数 -webkit-line-clamp: 4; 添加 -webkit-…...

ClickHouse常见的引擎和使用

1.日志引擎 日志引擎特点 1.数据存储在磁盘上 2.写入时将数据追加在文件末尾 3.不支持突变操作 4.不支持索引 5.非原子地写入数据 6.引擎不支持 ALTER UPDATE 和 ALTER DELETE 操作 建表语法示例 CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] ( …...

构建之法 - 软件工程实践教学:一线教师的13问

福州大学单红老师的软工课程总结 2020春&#xff0c;不一样的学期不一样的软工实践 单红⽼师在总结中&#xff0c;提出了13条疑惑&#xff0c;《构建之法》的作者邹欣⽼师就单红⽼师提出的每⼀条疑惑&#xff0c;给出了⾃⼰的思考&#xff0c;与他进⾏探讨交流。欢迎你也来参与…...

联调 matlab 遇到的一些事儿

记录当时遇到的问题&#xff0c;因为平时不写 matlab&#xff0c;所以没有深入的理解。 版本兼容 当时遇到的第一个问题就是不同版本 matlab 带来的兼容性问题。同时开发使用的是 2021a 版本&#xff0c;而调试时使用的是 2022b 版本。在新版本中某些函数已被弃用&#xff0c…...

时序预测 | Matlab实现基于GRNN广义回归神经网络的电力负荷预测模型

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 时序预测 | Matlab实现基于GRNN广义回归神经网络的电力负荷预测模型 1.Matlab实现基于GRNN广义回归神经网络的电力负荷预测模型 2.单变量时间序列预测; 3.多指标评价,评价指标包括:R2、MAE、MBE等,代码质量极高…...

3.2 Tomcat基础

1. Tomcat概述 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器&#xff0c;属于轻量级应用服务器。 Tomcat版本&#xff1a;apache-tomcat-8.5.76。 2.IDEA集成Tomcat 第一步 第二步 第三步 ​ 编辑切换为居中 添加图片注释&#xff0c;不超过 140 字&#xff0…...

认识http的方法、Header、状态码以及简单实现一个http的业务逻辑

文章目录 http的方法http状态码http重定向http常见Header实现简单业务逻辑Protocol.hppUtil.hppServer.hppServer.cc 效果 http的方法 方法说明支持的HTTP版本GET获取资源1.0/1.1POST传输实体主体1.0/1.1PUT传输文件1.0/1.1HEAD获得报文首部1.0/1.1DELETE删除文件1.0/1.1OPTIO…...

Faiss在windows下安装和使用

pip install faiss-cpu 直接安装可能出现问题&#xff1a; error: command swig.exe failed: No such file or directory 安装swig即可解决&#xff0c;安装方式...

【JavaEE进阶】SpringBoot项目的创建

文章目录 一. SpringBoot简介1. 什么是SpringBoot?2. SpringBoot的优点 二. SpringBoot项目创建1. 使用IDEA创建2. 使用网页创建SpringBoot项目 三. 运行SpringBoot项目 一. SpringBoot简介 1. 什么是SpringBoot? Spring Boot 是一个用于快速构建基于 Spring 框架的应用程序…...

c++二进制转化十进制代码(小数)

#include <bits/stdc.h> using namespace std; int mid; double er_shi(string a){int lena;double sum0;int p0;int q-1;int yn1;//判断是否小数 lenaa.length();//字符串长度 for(int i0;i<lena;i){if(a[i].){midi;yn0;break;} }if(yn0){for(int jmid-1;j>0;j--…...

07_ansible, 条件选择、加载客户事件、在roles和includes上面应用’when’语句、条件导入、基于变量选择文件和模版、注册变量

10.条件选择 10.1.When语句 10.2.加载客户事件 10.3.在roles和includes上面应用’when’语句 10.4.条件导入 10.5.基于变量选择文件和模版 10.6.注册变量 10.条件选择 转自&#xff1a;http://www.ansible.com.cn/docs/playbooks_conditionals.html#id3 常常来说,一个play的…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...