1.Android Studio编译错误transformClassesWithJarMergingForDebug
原因
:缓存或者内部原因。
解决方法
:清空缓存或者参考:[(
https://github.com/HujiangTechnology/gradle_plugin_android_aspectjx/issues/2
)
2.Android真机调试连接不上Chrome调试控制台
原因
:手机所处的wifi环境与电脑不一致或者adb设置原因。
解决方法
:
——检查手机网络是否和电脑网络处于同一个ip,如未打开无线网络等原因。
——检查是否是8081端口被占用。
——如果项目跑的起来,但是调试控制台连接不上,并且报错是跨域问题,我们可以尝试修改adb环境配置,执行这一段代码:
adb reverse tcp:18081 tcp:18081
重新加载项目,并且修改控制台地址为
http://localhost:8081/debugger-ui/
查看是否有效。
3.ScrollView内部嵌套的ScrollView无法滚动
原因
:JS中的ScrollView只是映射到常规的滚动视图android组件。Android默认不支持。如果你想使用它,你需要包装另一个能够这样做的android组件。
解决方案
:
参考:
https://github.com/facebook/react-native/issues/2967
4.React-Native中的表单输入被键盘遮挡的问题
原因
:默认我们可能需要解决的是在ios系统上的滚动,
解决方案
:
参考:
https://blog.csdn.net/sinat_17775997/article/details/72953940
——插件解决 import KeyboardSpacer from 'react-native-keyboard-spacer'
Android推荐使用以下方法:
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
4.React-Native中的如何获取弹出的系统键盘的高度等信息
import { Keyboard } from 'react-native';
componentWillUnmount() {
this.keyboardDidShowListener.remove();
this.keyboardDidHideListener.remove();
componentWillMount() {
this.keyboardDidShowListener = Keyboard.addListener('keyboardDidShow', this._keyboardDidShow.bind(this));
this.keyboardDidHideListener = Keyboard.addListener('keyboardDidHide', this._keyboardDidHide.bind(this));
_keyboardDidShow(e) {
endCoordinates: {
screenX: 0,
height: 253,
width: 360,
screenY: 387
this.setState({
keyboardHeight: e.endCoordinates.height
_keyboardDidHide(e) {
this.setState({
keyboardHeight: 0
5.React-Native中Android父元素内部子元素绝对定位超出父元素被隐藏
原因:此现象在ios能够正常的显示,在Android超出部分直接被隐藏,猜想应该就是Android的解析原因。
解决方案:
这是我的一个hack解决办法,具体的情况我们先看下面这个栗子:
import React, { Component } from 'react';
import { View, Text, StyleSheet } from 'react-native';
export default class TestScreen extends Component {
render() {
return (
<View style={styles.container}>
<Text>我是测试页面</Text>
<View style={styles.parent}>
<View style={styles.children}>
<Text>我是内部绝对定位文本</Text>
</View>
</View>
</View>
const styles = StyleSheet.create({
container: {
flex:1,
alignItems: 'center',
justifyContent: 'center',
parent: {
width:300,
height: 40,
backgroundColor: 'yellow',
alignItems:'center',
position:'absolute',
children:{
height:20,
justifyContent: 'center',
top:-10
在Android上神奇的显示效果:
6.React-Native中如何设置像Web一样的backgroundImage?
原因:React-Native中并没有background-image属性,只有一个Image标签,我们可以将Image标签设置全屏或者父元素下全屏效果。
解决方案:
参考:HOW TO SET A FULL-SCREEN BACKGROUND IMAGE IN REACT NATIVE
<Image source={require('./assets/images/isolate/loginBg.png')} style={styles.backgroundImage} />
const styles = StyleSheet.create({
backgroundImage:{
flex:1,
alignItems:'center',
justifyContent:'center',
width:null,
height:null,
backgroundColor:'rgba(0,0,0,0)',
7.React-Native中如何获得ScrollView已经滚动的高度?
解决方案:
_onScroll=(e)=>{
console.log(event.nativeEvent.contentOffset.x);//水平滚动距离
console.log(event.nativeEvent.contentOffset.y);//垂直滚动距离
<ScrollView onScroll={this._onScroll}>
</ScrollView>
8.React-Native中如何设置阴影效果?
//ios
shadowColor:color,
shadowOffset: {width: number, height: number},
shadowOpacity: number,
shadowRadius: number
//android
elevation:5
9.React-Native中如何获得组件在屏幕上的位置?
import { UIManager} from 'NativeModules';
import { findNodehandle } from 'react-native'
//如果不这样引入,可能会出现这个报错
//Undefined is not a function(React.findNodehandle)
//当某个组件onLayout的时候我们可以调用这个方法:
// x、y:为视图的相对位置。width、height:为视图的宽度和高度。pageX、pageY为视图在屏幕上的绝对位置
_onLayout = () => {
const handle = findNodeHandle(this.innerScroll);
UIManager.measure(handle, (x, y, width, height, pageX, pageY) => {
console.log(x, y, width, height, pageX, pageY)
10.React-Native中如何去适配iphoneX样式?
import {
PixelRatio,
Dimensions,
Platform,
findNodeHandle,
UIManager
} from 'react-native';
export const deviceW = Dimensions.get('window').width;
export const deviceH = Dimensions.get('window').height;
const X_WIDTH = 375;
const X_HEIGHT = 812;
* 判断是否为iphoneX
* @returns {boolean}
export function isIphoneX() {
return (
Platform.OS === 'ios' &&
((deviceH === X_HEIGHT && deviceW === X_WIDTH) ||
(deviceH === X_WIDTH && deviceW === X_HEIGHT))
* 根据是否是iPhoneX返回不同的样式
* @param iphoneXStyle
* @param iosStyle
* @param androidStyle
* @returns {*}
export function ifIphoneX(iphoneXStyle, iosStyle, androidStyle) {
if (isIphoneX()) {
return iphoneXStyle;
} else if (Platform.OS === 'ios') {
return iosStyle
} else {
if (androidStyle) return androidStyle;
return iosStyle
11.React-Native中自定义styleSheet?
import { StyleSheet, Platform } from 'react-native';
function create(styles) {
const platformStyles = {};
Object.keys(styles).forEach((name) => {
const { ios, android, ...style } = styles[name];
let xeStyle = style;
if (ios && Platform.OS === 'ios') {
xeStyle = { ...style, ...ios };
if (android && Platform.OS === 'android') {
xeStyle = { ...style, ...android };
platformStyles[name] = xeStyle;
const result = StyleSheet.create(platformStyles);
return result;
export default {
...StyleSheet,
create,
//使用时:
import StyleSheet from '../utils/StyleSheet';
const styles = StyleSheet.create({
container: {
justifyContent: 'center',
alignItems: 'stretch',
ios: {
paddingTop: 64,
android: {
paddingTop: 44,
12.React-Native中使用震动API
使用场景:新消息通知等场景。
- Android注意事项:
添加<uses-permission android:name="android.permission.VIBRATE"/>
到AndroidManifest.xml. - 由于iOS中的振动持续时间不可配置,因此与Android有一些差异。在Android中,如果pattern是数字,则它指定以毫秒为单位的振动持续时间。如果pattern是一个阵列,那些奇数指数就是振动持续时间,而偶数指数则是分离时间。
- 在iOS中,调用vibrate(duration)只会忽略持续时间并在固定时间内振动。虽然pattern阵列被用来定义每个振动之间的持续时间。
- 也支持可重复的振动,振动将以定义的模式重复,直到cancel()被调用
import { Vibration } from 'react-native'
const DURATION = 10000
const PATTERN = [1000, 2000, 3000]
------------------------------------------------------------------------
Vibration.vibrate(DURATION)
------------------------------------------------------------------------
Vibration.vibrate(PATTERN)
------------------------------------------------------------------------
Vibration.vibrate(PATTERN, true)
------------------------------------------------------------------------
Vibration.cancel()
这个版本未完善,持续更新汇总,欢迎留言分享经验。
Android Studio编译错误transformClassesWithJarMergingForDebug原因:缓存或者内部原因。解决方法:清空缓存或者参考:[(https://github.com/HujiangTechnology/gradle_plugin_android_aspectjx/issues/2)列表内容...
React-Native-ViewPager
适用于android和ios的
react-native的ViewPager和Indicator组件。 ViewPager的道具与相同。
将<ViewPagerAndroid>和<ScrollView xss=removed>统一为<ViewPager>,并提供与相同的道具。
<IndicatorViewPager>组件支持渲染指示器
实现通用指示器:DotIndicator,TitleIndicator和TabIndicator
生成并运行演示
cd RNViewPagerDemo/
npm install
react-native-ios-modal
一个用于在 iOS 上显示模式的 react-native 组件,通过将 react-native 视图本地包装在UIViewController并呈现它。
由于这只是使用UIViewController ,因此该组件还支持设置UIModalPresentationStyle和UIModalTransitionStyle 。
支持设置isModalInPresentation并在模态使用pageSheet modalPresentationStyle时单独禁用本机向下滑动手势。
您可以在应用程序的任何位置使用ModalView ,并通过 ref 以编程方式或在安装/卸载ModalView时自动以模态方式呈现视图。
使用UIBlurEffect支持多个模态事件、多个模态以及具有透明背景或模糊背景。
您可以使用它,但它仅适用于 iO
一个可响应本机的模块,可以侦听设备的方向变化,获取当前方向,锁定为首选方向。 (跨平台支持)
将屏幕锁定方向为PORTRAIT | LANDSCAPE-LEFT | PORTRAIT-UPSIDEDOWN | LANDSCAPE-RIGHT。
听设备的方向变化
获取设备的当前方向
ChangeLog详细信息v1.2.0突破性变化
添加对lockAllOrientationsButUpsideDown的支持
在Web和桌面上忽略(#115)
修复了找不到@
ReactModule(#125)的
问题
修复Android上的unlockAllOrientatio
react-native-bluetooch-escpos-printer
用于蓝牙ESC / POS和TSC打印机的React-Native插件。
任何问题或错误,请提出一个问题。
##仍在开发中
#可以支持Android / IOS
通过NPM安装签
npm install react-native-bluetooth-escpos-printer --save
或通过github安装
npm install https://github.com/januslo/react-native-bluetooth-escpos-printer.git --save
将插件链接到您的RN项目
react-native link react-native-bluetooth-escpos-printer
手动链接(Android)
确保您的构建文件符合以下要求:
react-native-shadow-2
已死亡多年。 这是一个改进的版本,具有更多功能,Typescript支持并从头开始编写。
它解决了React Native在Android和iOS上不具有相同阴影外观的问题。 它也可以在无法使用elevation旧Android版本上使用。
当我开始考虑这个影子问题的解决方案时,由于我描述的原因, 网站在两个平台之间不会给您非常相似的结果。
您将需要安装 。 对于RN> 0.60,它只是npm i react-native-svg / yarn add react-native-svg 。
然后,安装此软件包:
npm i react-native-shadow-2 / yarn add react-native-shadow-2
import { Shadow } from 'react-native-shadow-2'
if(navigator.userAgent.match(/iphone/i)){
var verinfo = navigator.userAgent.match(/os [\d._]*/gi);
version = (verinfo+"").replace(/[^0-9|_.]/ig,"").replace(/_/ig,".");//获取具体的系统版...
RN中阴影效果仅支持ios,实现ios端阴影类似如下:
shadowColor: '#999', //设置阴影色
shadowOffset:{width:0,height:0}, //设置阴影偏移,该值会设置整个阴影的偏移,width可以看做x,height可以看做y,x向右为正,y向下为正
shadowOpacity: 1,
shadowRadius: 1.5, //设置阴影模糊半径,该值设置整个阴影的半径,默认的效果就是View的四周都有阴影
实现android端阴影
<Text numberOfLines={2} style={styles.recentText}>北京京东尚科信息技有限公司北京京东尚科信息技有限公司北京京东尚科信息技有限公司</Text>
请注意:numberOfLines是Text组件的属性,而不是在style中写的
这个需求的实现很神奇,Text自己有一个属性 numberOfLines ,可以控制超出几行会显示省略号,但是这个属性不满足项目需求,只能自己造一个,虽然有点low的感觉,但是好歹实现了。
<Text>
{title ? (title.length > 5 ? title.substr(0, 5) + "..." : title) : ""}
</Text>