连接手机安装
- 打开手机 设置 > 更多设置 > 开发者选项 > 开启USB调试,开启USB安装
- 打开CMD,执行
adb reverse tcp:8081 tcp:8081
- 通过USB连接电脑,在授权确认后,选择同意后打开app
- 摇晃手机,呼出开发者菜单后,执行
Reload
(Reload JS)
连接手机调试
默认情况下模拟器可以自动探测宿主机 ip 并连接,部分情况需要设置
通过USB访问服务器
(Android 5.0 及以上)可以使用 adb reverse 命令
- adb reverse tcp:8081 tcp:8081
通过WIFI访问服务器
- 确保电脑和手机在同一局域网下,(例如:同一WIF下或者电脑开热点),
- 查询PC端IP (打开 CMD,执行
ipconfig
查看无线局域网WLAN 2的IP) - 打开
开发APP
,摇晃手机呼出开发者菜单,点击Settings
(Dev Settings) >Debug server host for device
- 设置为IP端口(例如:192.168.0.1:8081),设置后在开发者菜单执行
Reload
(Reload JS)
正常情况应该没问题,如果出现报错,注意看报错内容
路由导航配置
从0.44版本开始,navigator就被react native剥离了核心组件库,之后推荐使用React Navigation
yarn add @react-navigation/native
yarn add @react-navigation/stack
yarn add @react-navigation/bottom-tabs
yarn add react-native-reanimated react-native-gesture-handler react-native-screens react-native-safe-area-context @react-native-community/masked-view
0.6版本 自动连接依赖库,0.6 以下请前往 ReactNavigation API 查看
在APP.js 或者 index.js 添加
import 'react-native-gesture-handler';
import {NavigationContainer} from '@react-navigation/native';
import React from 'react';
export default function App(){
return(
<NavigationContainer>{/* 你APP的其他代码 */}</NavigationContainer>
)
}
本地存储配置
官方目前不推荐使用 AsyncStorage ,官方推荐使用@react-native-community/async-storage async-storage目前有分两个版本1.x和2.x ,默认是1.x
yarn add @react-native-async-storage/async-storage
0.6版本 自动连接依赖库,0.6 以下请前往 async-storage API 查看
在js中使用async-storage
import AsyncStorage from '@react-native-async-storage/async-storage';
// async-storage仅存储字符串,如要存储对象需要转为字符串,对象中如果有函数,函数会被stringify() 方法取消掉
let str=JSON.stringify({'a':1})
AsyncStorage.setItem('day',str)
//请求key为day的数据
AsyncStorage.getItem('day').then((val)=>{
val != null ? JSON.parse(val) : null;
})
还有一些其他方法,具体请查找API
渲染HTML页面
官方目前不推荐使用 WebView ,官方推荐react-native-webview
yarn add react-native-webview
0.6版本 自动连接依赖库,0.6 以下请前往 react-native-webview API 查看
在js中使用react-native-webview
import React, { Component } from 'react';
import { WebView } from 'react-native-webview';
// 远程网络页面
const MyWeb1=()=>{
return(
<WebView
source={{ uri: 'https://infinite.red' }}
style={{ marginTop: 20 }}
/>
)
}
// html字符串代码
const MyWeb2=()=>{
return(
<WebView
originWhitelist={['*']}
source={{ html: '<h1>Hello world</h1>' }}
/>
)
}
RN 的UI控件
有时候一些常见的UI控件,可以使用第三方的控件集合来保证风格的统一性
yarn add react-native-elements
yarn add react-native-vector-icons
0.6版本 自动连接依赖库,0.6 以下请前往 reactnativeelements API 查看
在js中使用组件
import { Button } from 'react-native-elements';
<Button />;
在此套UI组件中有很多组件,前往 API 查看
开发中遇到的问题
网络图片不显示
1 : 在 Android 9以上的版本,默认是禁止一切不安全的请求,如http请求,如果图片是http请求就会白
- 打开
android\app\src\main
目录下的AndroidManifest.xml
添加以下代码
<application
+ android:usesCleartextTraffic="true"
...
>
2 : 在ReactNative中,默认是不支持SVG图片的,如果需要显示,需要引入react-native-svg
FlatList 和SectionList 卡住
当 FlatList
和 SectionList
被 ScrollView
包裹的时候,当ScrollView
出现滚动条会导致内部的长列表滚动条不出现,当ScrollViw
包裹ScrollView
的时候一样会导致内部ScrollView
卡住。
ReactNative Task :app:processDebugResources FAILED
报错:ReactNative Task :app:processDebugResources FAILED FAILURE: Build failed with an exception. What went wrong: Execution failed for task ‘:app:processDebugResources’. java.io.IOException
解决方法:在window的环境下,打开cmd执行 cd android
然后执行gradlew clean
底部导航按钮点击有问题,
底部导航出现点击面小的问题,底部高50 但是点击字体和ico都没啥反应,只有点击字体底部大概那么一小点才有反应;可能是打包解析有问题。
解决方法:使用自定义tabBar定义,或者等tabBar解析成功后可以去除tabBar,
Task :app:compileDebugJavaWithJavac FAILED
安装一些第三方库的时候,会需要用到原生组件,然后当你在没有取消链接的情况下,卸载该库会导致打包出错。正确做法应该是先取消链接,在卸载第三方库包;npx react-native unlink xxx
npm uninstall xxx
如果未按正确取消链接,请打开 ./android/settings.gradle 文件,删除该库引用,例如
include ':react-native-xxx' //Your library name
project(':react-native-xxx').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-abc/android-exoplayer')
打开 ./android/app/src/main/java/com/xxx/MainApplication.java 文件,删除该库引用
import com.github.wuxudong.rncharts.abc;
如果找不到要删除的包名称,或者不知道哪里出错了,可以执行以下代码,查看具体报错
cd android
&& gradlew clean
&& gradlew :app:bundleRelease