react-native开发笔记

2019-04-24  本文已影响0人  太平洋_cfd2

一:出现:

unknown platform:react-native

ReferenceError:printExample is not defined

错误,

则:

npm install / yarn install;

npm start;

二:出现the development server... code:500的错误

1. Try run npm start and react-native run android. Maybe your Metro Bundler isn't started.(暂时未解决)

2. 就是代码出错

三:React Native 依赖踩坑实录——UnableToResolveError: Unable to resolve module `AccessibilityInfo

0 准备: 关闭所有dev过程的console 窗口和IDE,Emulator也关了吧

1 删除你的依赖文件夹 node_modules

2 清除npm缓存 $ npm cache clean --force

3 重新安装npm依赖 $ npm install

4 Clean RN 环境并重启试试 $ npm start -- --reset-cache

(yarn start -- --reset-cache),启动时,npm效果好

ps: 或者npm报错:npm ERR! A complete log of this run can be found in: npm ERR! C:\Users\Administrator\AppData\Roaming\npm-cache\_logs\2018-03-15T01_48_14_769Z-debug.log

1. npm i npm -g(还是报错,方法不太可行)

四:如果是安卓和iOS配置问题,切记,以官方文档为主

五:查错不看全路径,搞的一直崩溃,在android studio里

六:Android Studio的 Terminal下敲 gradlew  xxxx:dependencies 命令,查看依赖树,解决重复依赖

七:android中的gradle版本依赖一定要做到统一,不然会出现重复依赖,不管是module中还是app中,都要这样做

八:一般出现引用错误都是缓存问题,先清除缓存,在编译

九:ReactNativeJS: undefined is not a function (near '..._reactNativeNavigation.Navigation.startTabBasedApp...')是因为:这是v1版本,要迁移,如下例子https://wix.github.io/react-native-navigation/#/docs/top-level-api-migration

十:导入react-native-navigation-hybrid,注意导入时,link,否则出现null is object错误

https://www.npmjs.com/package/react-native-navigation-hybrid/v/0.8.2

link的作用也就是导入module,如:

include ':react-native-navigation-hybrid'

project(':react-native-navigation-hybrid').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-navigation-hybrid/android')

十一:导入react-native-navigation-hybrid的配置问题

https://www.npmjs.com/package/react-native-navigation-hybrid/v/0.8.2

https://github.com/listenzz/react-native-navigation-hybrid/blob/master/doc/integration-native.md

十二:从0开始的RN项目讲解,版本有点老,但思维还是一样的

https://juejin.im/post/5a9f93d96fb9a028d2077c19

十三:二维码导入报"RNSVGRect" was not found in the UIManager错误时

react-native link is missing the last step. it is not adding "new SvgPackage()"

Open up `android/app/src/main/java/[...]/MainApplication.java

Add new SvgPackage() to the list returned by the getPackages() method. Add a comma to the previous item if there's already something there.

十四:二维码生成,扫描(还未实现相册选择图片功能)

https://www.jianshu.com/p/dd1474c0a0cf    (react-native-qrcode)

https://www.jianshu.com/p/bfad4c158f07    (react-native-qrcode-svg, react-native-camera)

扫描二维码界面的生成

https://blog.csdn.net/qq_34619754/article/details/83346602

十五:导入百度地图后出现,错误app:transformDexArchiveWithDexMergerForDebug

https://www.jianshu.com/p/7192eb0065a0 (百度地图的插件安装方法)

https://github.com/lovebing/react-native-baidu-map (git上,百度地图第三方库)

这个错误的解决:这是个依赖重复的错误,实际上后面还有一句话:方法数剧增,超过64k

解决办法是:https://www.jianshu.com/p/cddfc89ce947,android:name的名字可以考虑不改,试试看

实在解决不了"BaiduMapView" was not found in the UIManager.,

可采用另外的百度SDK: https://github.com/qiuxiang/react-native-baidumap-sdk

地图的详细用法:https://blog.csdn.net/qq_39910762/article/details/82882786

当百度地图报错:BaiduMapView was not found in the UIManager;解决方案是:

protected void init(ReactApplicationContext reactContext) {

        if (Looper.myLooper()==null){

            Looper.prepare();

        }

        SDKInitializer.initialize(reactContext.getApplicationContext());

    }

即:在BaiduMapPackage加上if (Looper.myLooper()==null){

            Looper.prepare();

        }

其实在每次应用运行的时候,都会报一次Only one Looper may be created per thread,但是我没有理会,因而造成如此大的BUG,引以为戒。

十六:百度地图出错:Authentication Error errorcode: -1 uid: -1 appid -1 msg: Current network is not available.

// 这是给百度api加权限

<uses-permission android:name="android.permission.USE_CREDENTIALS" />

<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />

<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

十七:报错:Could not connect to development server

https://www.jianshu.com/p/be012c4b3e66

解决办法:adb reverse tcp:8081 tcp:8081

十八:百度地图xml配置详细解释

https://zhulichao.github.io/2017/06/17/react-native-baidu-map-android/

十九:实现自定义标记

https://www.jianshu.com/p/030d2be37095

Overlay:简单说明

https://blog.csdn.net/WuLex/article/details/79530450

Overlay:覆盖物的抽象基类,所有的覆盖物均继承此类的方法。

Marker:标注表示地图上的点,可自定义标注的图标。

Label:表示地图上的文本标注,您可以自定义标注的文本内容。

Polyline:表示地图上的折线。

Polygon:表示地图上的多边形。多边形类似于闭合的折线,另外您也可以为其添加填充颜色。

Circle: 表示地图上的圆。

InfoWindow:信息窗口也是一种特殊的覆盖物,它可以展示更为丰富的文字和多媒体信息。注意:同一时刻只能有一个信息窗口在地图上打开

map.addOverlay方法向地图添加覆盖物

map.removeOverlay方法移除覆盖物,注意此方法不适用于InfoWindow

二十:大头针实际上是Overlay.Marker标签,然后用其属性,自定义icon就可以更改其图片了

二十一:报firebase不能open时,是权限问题,比如定位权限、文件读写权限等

二十二:des加密react-native写法

https://blog.zhengxianjun.com/2015/05/javascript-crypto-js/

二十四:react-native获取定位权限

https://blog.csdn.net/mochiwxtianya/article/details/80132861

二十五:浏览器控制台显示数组不全时:使用以下方法

console.log(JSON.stringify(数组或对象));

二十六:获取地图位置、相册等,需要动态权限

React Native (六) CameraRoll 相册组件

https://nealma.com/2016/07/29/react-native-6-cameraroll/

React Native - 使用CameraRoll获取相册图片、并显示

https://blog.csdn.net/qq_38719039/article/details/79469659

react-native-image-picker图片、框架

二十六:fetch上传图片时,大小不能超过2M

二十七:for循环中传参,一定要注意for里面的值不能用var,得用let

二十八:xml资源文件夹的创建方式,不能手动自己create,应该是,new->floder->xml resource floder(重点:并且,要运行react-native run-android命令;重点2:不要用android studio创建xml,也就是复制xml文本进android studio)

二十九:app的基础设置(app名字,不能横屏、启动图等)

https://www.twblogs.net/a/5b85b35a2b71775d1cd3bb1c/zh-cn

https://blog.whezh.com/react-native-name-icon-launch/

三十:加法验证码

https://www.jianshu.com/p/f82872224566

三十一:react-native经典库推荐

http://www.051z.cc/food/javascript/p_343.html

三十二:滑动验证码

https://github.com/asyalas/react-native-verification

其中注意:滑动异常的解决方案

你可以尝试把

this.move += e.nativeEvent.locationX

改成

this.move = gesture.dx

三十三:Android 8.0跳坑之'Only fullscreen opaque activities can request orientation'(荣耀8报错)

https://blog.csdn.net/DadaCockWire/article/details/80250152

三十四:照相机和图片 react-native-image-picker以及 react-native-image-crop-picker

https://segmentfault.com/a/1190000015735377

三十五:在完成app时,尽可能多用库,不用考虑大小,自己学的效果太差,后期再考虑瘦包

三十六:采用图片选择器时,用这个库

react-native-syan-image-picker

三十七;"data" is required in save()!错误的解决办法

就是在storage中set或save了null,因此再报错

三十八:js中[] == ''也是成立的,当然用===就不成立了

三十九:退出应用采用此方法

SplashScreenModule.java中添加

    /**

    * 退出程序

    */

    @ReactMethod

    public void exit() {

        if (getCurrentActivity() != null)

            getCurrentActivity().finish();

        System.exit(0);

    }

四十:热更新,没有经过pushCode的实现方法

https://juejin.im/post/5c2038bff265da61542da11c

四十一:React Native 性能优化总结

https://github.com/amandakelake/blog/issues/49

四十二:React-Native Android第一次安装成功后,点击Home键,打开重启问题

https://blog.csdn.net/Ghost_tal/article/details/89476644

四十三:百度地图的安全码就是开放平台设置ak后,自动形成的,也就是在逆向地址编码时,需要的参数

四十五:网易云私信

https://github.com/reactnativecomponent/react-native-netease-im/pull/19

四十六:字符串转数组

var array1 = list.replace('[{', "");

var array2 = array1.replace('}]', "");

var array = array2.split(",");

四十七:网易云信发送文本报错,就是glide中的string(同学说string为空的缘故)

切换账号搞定此问题

真正问题的来源,经过调试之后发现在ReactMsgListManager.java文件中,231行到242行注释掉,就不会崩溃了,但是图片没有显示出来

//                        RequestManager m = Glide.with(reactContext);

//                        DrawableTypeRequest request;

//

//                        if (string.startsWith("http://") || string.startsWith("https://")) {

//                            request = m.load(string);

//                        } else {

//                            request = m.load(new File(string));

//                        }

//                        request.fitCenter()

//                                .placeholder(IdHelper.getDrawable(reactContext, "aurora_picture_not_found"))

//                                .override(imageView.getMaxWidth(), Target.SIZE_ORIGINAL)

//                                .into(imageView);

四十八:接上述,显示图片的问题的解决办法

原来是react-native-syan-image-picker和IM库中的glide版本有冲突

查了很久,不是兼容性问题,并不是两个版本问题

四十九:发送图片失败,改为react-native-image-crop- picker选择图片发送就ok了

五十:react-native库(第三方)

https://juejin.im/post/5b915770e51d450e9f66de40

五十一:可滚动Tab

https://github.com/ptomasroos/react-native-scrollable-tab-view

五十二:react-native-image-crop- picker与react-native-syan-image-picker兼容性问题:ucrop重复依赖

根据错误信我可知是ucrop重复依赖,去library文件夹中查看,哪里有ucrop的重复,去除就好

compile ('com.github.LuckSiege.PictureSelector:picture_library:v2.2.3') {

        exclude group: 'com.github.LuckSiege.PictureSelector', module: 'ucrop'

    }

因为com.github.LuckSiege.PictureSelecto中也有ucrop库,因此通过此方法去掉ucrop依赖,并且还依赖了com.github.LuckSiege.PictureSelector中除ucrop的库

五十三:朋友圈文件

https://github.com/yubo725/rn-wechat/blob/master/app/screens/MomentScreen.js

五十四:图片兼容后,glide的版本不兼容解决办法

compile ('com.github.LuckSiege.PictureSelector:picture_library:v2.2.0') {

        exclude group: 'com.github.LuckSiege.PictureSelector', module: 'ucrop'

        exclude group: 'com.github.bumptech.glide'

    }

exclude就是排除的意思。

这么操作之后就会发现项目依赖的是自己引入的3.7的glide了。

五十五:当依赖有冲突时,强制统一依赖,在configurations.all 加入以下即可

// 统一使用glide3.7.0

    resolutionStrategy {

        force 'com.github.bumptech.glide:glide:3.7.0'

    }

五十六:当react-native-syan-image-picker改为glide3.7后,图片功能失败,因此

compile ('com.github.LuckSiege.PictureSelector:picture_library:v2.0.6') {

        exclude group: 'com.github.LuckSiege.PictureSelector', module: 'ucrop'

    }

v2.0.6中,glide为3.7.0

五十七:调试过程中,很多方法会失效,可以关闭debug来解决

关闭chrome debugger

五十八:import中路径名后面的名字是文件名

五十九:匿名方法拿参数时,需要在匿名中添加参数;传参数时,匿名方法中的方法给参数值

六十:设置小红点(react-natvie-navigation)

badge: ' ', // 设置空字符串就是小红点

badgeColor: 'red',

六十一:文件上传时,boundary设置出问题,导致无法发送成功

https://segmentfault.com/a/1190000010205162

六十二:state方法

state更新无效,将setState方法重写一下就好了

六十三:required cycle (依赖库中)的解决办法是直接忽略

因为并不是真出现了循环引用(我们在使用中,没有循环引用),因此如下解决方法

YellowBox.ignoreWarnings(['Warning:', 'Possible', 'Debugger', 'http', 'cycle']);

六十四:react-native中报错:make sure to start component names with a capital letter

在JSX中,小写标记名称被认为是HTML标记。但是,带点(属性访问器)的小写标签名称不是。

请参阅HTML标记与React组件。

<component />编译成React.createElement('component')(html标签)

<Component /> 编译成 React.createElement(Component)

<obj.component /> 编译成 React.createElement(obj.component)

六十五:特别重要的基础类库(image、text、page等)

react-native-element

https://tech.meituan.com/2018/09/27/waimai-beeshell-popularize.html

六十六:react-native错误“line:24049,column:31,sourceURL:http//localhost:8081/index.delta?...”

解决办法:https://github.com/facebook/react-native/issues/10404

实际是没网络的原因

六十七:android studio出现scanning files to index的解决办法

https://blog.csdn.net/weixin_41647586/article/details/89929472

六十八:react-native组件库

https://www.jianshu.com/p/18fd4b438958

六十九:ip不通、或者无网络时,错误请求处理(line:139 column 2655 sourceURL:index.android.bundle)

七十:react-native link 的意思是:link所有依赖库

七十一:拍照图片已损坏是我查找答案时,有些答案不屑于看,实际这才是真正的能解决问题的答案(引以为戒)

需要动态获取文件存储权限

七十二:FastImage图片未读取出来原来是无网络的原因,并不是库的问题

七十三:Android依赖导入全攻略

https://juejin.im/post/5acd6daaf265da238a30ca73

七十四:图片上传小逻辑

https://www.jianshu.com/p/1ecf892a0069

七十五:导入旧项目后报错:Manifest merger failed : Attribute application@appComponentFactory value=(android.support.v4.app.CoreComponentFactory)...

https://www.jianshu.com/p/f7a7a8765294

// 谷歌googlePlayGCM版本升级,导致项目本身未兼容androidx而出错,现在将googlePlayGCM的版本降下来,来解决这个问题(googlePlayServicesVersion = '8.3.0')

七十六:报错com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives:

实际上是安卓API:28/29之间的冲突,当依赖未写版本,而是依赖到更新版本是(以+结尾),当最新版本所依赖的库更新到与本项目库冲突时,解决方法可依据依赖冲突解决方案

七十七:ReactNative——react-native-video实现视频全屏播放

https://juejin.im/post/5a9f9fde518825557207e7b0

七十八:拍摄视频(openVideo()方法中)

.openCamera(PictureMimeType.ofVideo())

改为:

.openGallery(PictureMimeType.ofVideo())

并在react-native-syan-image-picker中的index.js中添加:

openVideo(options, callback) {

        const optionObj = {

            ...defaultOptions,

            isCamera: false,

            allowPickingGif: false,

            allowPickingVideo: true,

            allowPickingGif: true,

            allowPickingImage: false,

            allowPickingMultipleVideo: true,

            videoMaximumDuration: 20,

            MaxSecond: 60,

            MinSecond: 0,

            recordVideoSecond: 60,

            videoCount: 1,

            ...options

        };

        return RNSyanImagePicker.openVideo(optionObj, callback)

    }

七十九:开发环境和调试环境中,功能会不一样哦,因此有些问题并不是代码的问题。(例如:拍摄视频后,不显示刚保存的视频问题)

八十:Attempted to transition from state `RESPONDER_INACTIVE_PRESS_IN` to `RESPONDER_ACTIVE_LONG_PRESS_IN`

关闭调试模式即可

八十一:无法remote chrome

晃动手机弹出菜单,点击DEV Settings ->Debug server host&port for device 配置电脑的ip:8081

八十二:React DevTools不会自动连接到RN

看到这种情况发生了几次。刷新模拟器始终修复它。

八十三:Attempted to transition from state `RESPONDER_INACTIVE_PRESS_IN` to `RESPONDER_ACTIVE_LONG_PRESS_IN`, which is not supported. This is most likely due to `Touchable.longPressDelayTimeout` not being cancelled.

是手机设备和电脑设备的时间不对应导致,改为电脑早一分钟就好。

八十四:Nothing was returned from render. This usually means a return statement is missing. Or, to render nothing, return null,这是因为代码中return同一行没有代码

render(){

    return

    (

      <div>

        <p>App test</p>

      </div>)

  }改为

render(){

    return (

      <div>

        <p>App test</p>

      </div>)

  }

后正常

八十五:优化Android系统设置大号字体后布局错乱的问题

https://blog.csdn.net/z191726501/article/details/47704137

八十六:failed to connect to ... (构建下载失败)

const options = {

  fromUrl: formUrl,

  toFile: downloadDest,

  background: true,

  // progressDivider: 5,

  // connectionTimeout: 5, 这个连接超时导致构建下载失败

  begin: (res) => {

    //开始下载时回调

    console.log('begin', res);

  },

  progress: (res) => {

    //下载过程中回调,根据options中设置progressDivider:5,则在完成5%,10%,15%,...,100%时分别回调一次,共回调20次。

    console.log('progress', res)

  }

}

八十七:封装网络请求时,不能用module.exports,而必须包含在class里(不一定,有时候可以再module中,交替使用就好,这是react-native的通病)

八十八:npm start -- --reset-cache启动不了的时候,应该把react-native中的主项目中,build文件夹下的文件全部清空,或者clean一下项目

八十九:HTTP 413 错误 – 请求实体太大 (Request entity too large)

https://www.checkupdown.com/status/E413_zh.html

九十:

上一篇下一篇

猜你喜欢

热点阅读