React Native之坑总结(持续更新)

Genymotion安装与启动

之前我用的是蓝叠(BlueStack)模拟器,跑RN程序也遇到了一些问题,都通过搜索引擎解决了,不过没有记录。

但是BlueStack有一些问题,比如没有菜单键,模拟器默认是横向的,商业化太严重(本来是用来玩游戏的),界面太丑,等等......

于是我按照RN中文网的推荐下载了Genymotion模拟器,这一下,就是万劫不复......

我是在官网下载的Genymotion,自带VirtualBox 5.0.4版本。下载安装好后,我创建了一个virtual device,一切看起来都很正常。然而,当我点击Start后,却弹出错误提示,内容如下:

Unable to start the virtual device.
VirtualBox cannot start the virtual device.
To find out the cause of the problem, start the virtual device from VirtualBox.

我去百度以上信息,结果都是让我打开VirtualBox,设置balabala云云。悲剧的是,我的VirtualBox根本打不开。去搜索也没有什么有效信息。无奈我下了个4.3版本的VirtualBox重装了下,这次轮到Genymotion打不开了。提示如下:

Unable to load VirtualBox engine.
Make sure that it is properly installed before starting Genymotion.

这个问题也是找了各种办法都没有用。

最后,我去官网下载了最新版的VirtualBox 5.18,结果好了。

内心真是崩溃。。花了近两个小时终于搞定了。。

Genymotion模拟器启动后,adb devices中显示找不到设备

解决办法:在Genymotion中Settings->ADB中选中Use custom Android SDK tools,选择Android SDK路径即可。

启动应用显示could not get batchedBridge

完整信息如下:

Could not get BatchedBridge, make sure your bundle is packaged correctly.

解决方法:点击模拟器的选项键或点击摇晃按钮,会弹出一个菜单,选择Dev Settings,在弹出的页面中点击Debug server host & port for device,填入本机IP + ":8081",如:10.138.253.3:8081

获取本机IP的方法是在cmd中输入ipconfig

启动RN应用后,提示找不到packager

我自然是启动了packager的,而且应用的Debug server host & port for device中也填了本机IP:10.138.253.3:8081。

然后出现这个问题就很奇怪了,后来我在网上找到了这篇帖子,里面提到了localhost与127.0.0.1,于是我去查了这两个东西。

发现127.0.0.1一定是本机IP,但是localhost有可能被解析成完全不同的IP地址,也就出现了上面找不到packager的情况。

于是我将应用的Debug地址改为了127.0.0.1:8081。果然成功了。

但是很奇怪的问题是为什么我使用BlueStack模拟器的时候填本机IP是没问题的,到了Genymotion就不行了。这个问题暂且搁置。。。

又一波血与泪的教训

其实大部分是自己写代码的时候没有注意小细节,RN的IDE又没有这么智能,所以出现了很多奇怪的错误。最后的错误报告可能和你写错的地方一点关系都没有,很蛋疼。。。

  • 类名要大写

  • 有一句let Component = route.component;中的第一个Component的首字母要大写。

  • antd-mobile的tabs组件有个bug:如果一个子页面中有输入框,输入任意一个字符后,tabs会自动向左滑动(最左边的子页面没有这个问题)。于是我把滑动的tabs换成了react-native-scrollable-tab

  • 如果不用ant design的form代码,就无法输入字符。下面是一个示例:

    import React, { Component } from 'react';
    import {
    Text,
    View
    } from 'react-native';
    import Button from 'antd-mobile/lib/button';
    import WhiteSpace from 'antd-mobile/lib/white-space';
    import List from 'antd-mobile/lib/list';
    import InputItem from 'antd-mobile/lib/input-item';
    import WingBlank from 'antd-mobile/lib/wing-blank';
    import { createForm } from 'rc-form'; class Register extends Component {
    render() {
    const {getFieldProps} = this.props.form;
    return (
    <View style={{flex: 1}}>
    <List>
    <InputItem
    {...getFieldProps('registerusername', {
    initialValue: ''
    })}
    clear
    placeholder="6-12位字母或数字"
    >用户名</InputItem>
    <InputItem
    {...getFieldProps('registernickname', {
    initialValue: ''
    })}
    clear
    placeholder="6-14位字符,一个汉字为两个字符"
    >昵称</InputItem>
    <InputItem
    {...getFieldProps('registerpassword', {
    initialValue: ''
    })}
    type="password"
    clear
    placeholder="******"
    >密码</InputItem>
    </List>
    <WhiteSpace size="lg"/>
    <WingBlank>
    <Button type="default" color="'#000000">注册</Button>
    </WingBlank>
    <WhiteSpace size="lg"/>
    </View>
    );
    }
    } Register = createForm()(Register);
    module.exports = Register;

不过这里的InputItem输入之后如何提交还需要研究。。

持续更新中……

Component类的一些方法

  • 在组件的生命周期中,getInitialState() 只执行一次,它负责对组件的state进行初始化。
  • 这里的componentDidMount是一个在React组件渲染以后将被React调用的方法。

一个坑

const { dispatch, room } = props;

这里的props更新之后,就不能再用room来访问更新的内容了,因为room是之前就确定的一个常量。

React Native之坑总结(持续更新)的更多相关文章

  1. React Native汇错归纳(持续更新中……)

    1.2017-10-25: 报错信息:“Cannot find entry file index.android.js in any of roots…..” 解决方法: 1.首先从虚拟机中找问题:看 ...

  2. React Native之code-push的热更新(ios android)

    React Native之code-push的热更新(ios android) React Native支持大家用React Native技术开发APP,并打包生成一个APP.在动态更新方面React ...

  3. React Native 填坑一

    React Native 填坑一 关于RN的布局 分为主轴和交叉轴, 主轴可以是横向也可以是竖向,交叉轴也是对应的. 主轴默认是竖向.如果要更改用flexdirection 主轴对齐方式:justif ...

  4. React Native填坑之旅--组件生命周期

    这次我们来填React Native生命周期的坑.这一点非常重要,需要有一个清晰的认识.如果你了解Android或者iOS的话,你会非常熟悉我们今天要说的的内容. 基本上一个React Native的 ...

  5. React Native填坑之旅--重新认识RN

    如同黑夜里的一道光一样,就这么知道了F8. F8是每年一次Facebook每年一次的开发者大会.每次大会都会release相应的APP,iOS.Android都有.之前都是用Native开发的,但是2 ...

  6. React Native填坑之旅--Navigation篇

    React Native的导航有两种,一种是iOS和Android通用的叫做Navigator,一种是支持iOS的叫做NavigatorIOS.我们这里只讨论通用的Navigator.会了Naviga ...

  7. React Native踩坑日记 —— tailwind-rn

    项目背景 在项目的初始阶段,我们需要建立自己的design system,我们spike了一些方案,tailwind-rn就是其中一种,如果有用到或者即将用到tailwind-rn的,可以进来看一看, ...

  8. React Native踩坑Tip

    最近在使用React Native(以下简称RN)中踩了个坑,RN只能异步调用原生方法,所以在原生方法直接调用UI刷新操作需要将任务递交到主线程才可以. RCT_EXPORT_METHOD(finis ...

  9. React Native填坑之旅--与Native通信之iOS篇

    终于开始新一篇的填坑之旅了.RN厉害的一个地方就是RN可以和Native组件通信.这个Native组件包括native的库和自定义视图,我们今天主要设计的内容是native库方面的只是.自定义视图的使 ...

随机推荐

  1. Egret3D研究报告(二)从Unity3D导出场景到Egret3D

    Egret3D暂时没有场编的计划,但是我们知道unity3D是一个很好的场编. 有一些游戏即使不是使用Unity3D开发,也使用Unity3D做场编.这里就不点名了,而且并不在少数. 我们就这么干. ...

  2. 清除Android工程中没用到的资源

    项目需求一改再改,UI一调再调,结果就是项目中一堆已经用不到但却没有清理的垃圾资源,不说工程大小问题,对新进入项目的人或看其他模块的代码的人来说,这些没清理的资源可能也可能会带来困扰,所以最好还是清理 ...

  3. linux笔记

    1 动态查看日志 tail -f filename tail -1000f filename 2 解压当前目录内容为xxx.zip  zip -r xxx.zip ./* 3 查看内存使用情况 fre ...

  4. HTML中的拖拉框----在路上(29)

    拖拽框---当鼠标按在指定的区域才可进行拖拽 思想:只有当鼠标是按在一个大div里的小div才可拖拽,其他不可:拖拽框有多种方法,这里以其中一种分享:下面使我自己写的demo,简单有效. <!D ...

  5. fir.im Weekly - 聊聊 Google 开发者大会

    中国互联网的三大错觉:索尼倒闭,诺基亚崛起,谷歌重返中国.12月8日,2016 Google 开发者大会正式发布了Google Developers 中国网站 ,包含了Android Develope ...

  6. scope.$apply是干嘛的

    开始用angular做项目的时候,一定碰到过$scope.$apply()方法,表面上看,这像是一个帮助你进行数据更新的方法,那么,它为何存在,我们又该如何使用它呢. JavaScript执行顺序 J ...

  7. C#中的Session

    一: 网站开发中,为了保存用户信息我们就会用到session. Session具有以下特点:(1)Session中的数据保存在服务器端:(2)Session中可以保存任意类型的数据:(2)Sessio ...

  8. CSS3与页面布局学习总结(四)——页面布局大全

    一.负边距与浮动布局 1.1.负边距 所谓的负边距就是margin取负值的情况,如margin:-100px,margin:-100%.当一个元素与另一个元素margin取负值时将拉近距离.常见的功能 ...

  9. 数百个 HTML5 例子学习 HT 图形组件 – 3D 建模篇

    http://www.hightopo.com/demo/pipeline/index.html <数百个 HTML5 例子学习 HT 图形组件 – WebGL 3D 篇>里提到 HT 很 ...

  10. Hive技术架构

    一.Hive概念 Facebook为了解决海量日志数据的分析而开发了Hive,Hive是一种用SQL语句来读写.管理存储在分布式存储设备上的大数据集的数据仓库框架. 1. 数据是存储在HDFS上的,H ...