第五章 RN与Native—由原生页面跳转到Rn页面;在Rn页面调用Android Native组件和Native数据

       在本教程的开始,就曾经提到过纯Rn和原生与RN混合开发的两种概念。之前的两个Demo如果不考虑难易程度的话,则为纯Rn应用开发。但在实际生产中,毕竟Rn的组件还不是那么完善,所以,当我们需要比较炫酷的动画效果或者在使用Rn组件时遇到诡异的坑而没有进展的时候,我们可以使用Rn与原生协同开发来实现最终效果。

React Native设计为可以在其基础上编写真正的原生代码,并且可以访问平台所有的能力。这是一个相对高级的特性,我们并不认为它应当在日常开发的过程中经常出现,但具备这样的能力是很重要的。如果React Native还不支持某个你需要的原生特性,你应当可以自己实现该特性的封装。(这就麻烦了)

下面,我们来介绍我们的Demo3,照例先给出效果图(Android):

(这个是在Demo2的样式基础上改的,由于Demo2的样式在Android上根本没法看,所以我适当增加了输入框的宽度,添加了marginBottom等…)

项目git地址:https://github.com/yujiesuperman/react-native-demo3-RnandNative

Demo3总共完成了两点:

从原生开机动画跳转到Rn登陆页面,从Rn主界面调用Native的Toast方法和获取字符串数据。

(一)从Rn页面调用Native的组件方法

      假设我们希望可以从Javascript发起一个Toast消息(Android中的一种会在屏幕下方弹出、保持一段时间的消息通知):

      使用AS导入Android文件夹下的gradle项目。

①第一步是先添加一个原生的类(CustomToastModule),让他继承ReactContextBaseJavaModule,  在这个方法中,我们主要的目的有两个,

      1)重写getName方法,比如这里return的是NativeToastAndroid

      2)重写一个show方法,里面有native实现的一些功能

最终的目的就是能在JavaScript中调用

NativeToastAndroid.show('这个弹窗来自Android ', NativeToastAndroid.SHORT );

来调起一个Toast通知。

备注:一个可选的方法getContants返回了需要导出给JavaScript使用的常量。它并不一定需要实现,但在定义一些可以被JavaScript同步访问到的预定义的值时非常有用。这样的话,JavaScript写SHORT或者LONG这边就能对应替换了

②再添加一个类(NativeToastAndroidReactPackage),继承ReactPackage,

这个类要将方法暴露出去,在应用的Package类的createNativeModules方法中添加这个模块,把我们的CustomToastModule加进去,让rn调用。

③在MainApplication中

       这里是第三个需要修改的类,刚才定义完ToastAndroidReactPackage方法的时候,需要在这里最终注册

添加到return列表里。

④从AS中切回Rn中,

这个方法不是必须的,为了让你的功能从JavaScript端访问起来更为方便,通常我们都会把原生模块封装成一个JavaScript模块。

这不是必须的,但省下了每次页面在使用之前,

都从NativeModules中获取对应模块( . NativeToastAndroid)  的步骤。这个JS文件也可以用于添加一些其他JavaScript端实现的功能(也就是说不必单拉出一个文件来实现这个东西,作者是为了方便阅读,才单建立的目录)。

⑤调用的时候,从上面引入

备注:从Rn调用Android的Toast组件我们已经写完了,那么有些同学可能要问了,那要从Native向Js传递数据该咋办?其实非常简单,而且又多种实现的方式,这里只列举一种:

在刚才的show方法下面再弄一个dataToJs,写法如上,然后在Rn的js中这样添加:

就完成了效果图中的Alert弹窗展示从Native端拿到的数据了,

至于其他的获取方式请参考Rn中文网链接:

http://reactnative.cn/docs/0.42/native-modules-android.html#content

注意:Rn也并没有封装全部的UI组件,只是封装了一部分,要想自己封装,提供一个ImageView之类的UI组件,则需要

①创建一个ViewManager的子类。

②实现createViewInstance方法。

③导出视图的属性设置器:使用@ReactProp(或@ReactPropGroup)注解。

④把这个视图管理类注册到应用程序包的createViewManagers里。

⑤实现JavaScript模块。

在这里就不详细介绍了,请想深入了解的朋友去Rn中文网上阅读相关内容:

http://reactnative.cn/docs/0.42/native-component-android.html#content

(二)加入原生开机动画AwesomeSplash

下面说下如何从炫酷的开机动画跳转到我们的Rn页面,其实非常简单,在GitHub上可以参看到AwesomeSplash的使用方法,

附上git链接:https://github.com/ViksaaSkool/AwesomeSplash

注意,他有一行注释,就是千万不要复写onCreate方法,所以,如果你和我一样是新建了一个activity,就要删掉你的onCreate方法。

而且还要从git-AwesomeSplash上面的Demo中把对应的缺失的文件补充进来,在下面的animationsFinished方法中创建跳转意图,跳转到RN的Activity页面。

最后从配置文件中,把我们的AnimActivity设置为启动页面即可。

备注:可能有些人要问了,你这是RN项目中集成Native页面,那如果是原有的Native项目该怎么去集成Rn页面呢?

其实我感觉原理是差不多的,类似于环境转移,比照着Rn项目生成的Native壳子里面的配置,去给我们自己之前的Native项目添加Rn支持,最后还是Native页面跳RnActivity或者RnFragment。

比如首先配置build.gradle,然后再还需添加react native的DevSettingActivity,写类继承ReactActivity,提供一个实现ReactApplication的全局Application文件等等…如果想了解具体步骤的话可以参看:http://lib.csdn.net/article/reactnative/50089


总结:

好了,Demo3也讲完了,现在我们来看下如果要进行一个Rn的项目开发大概需要进行哪些准备设计工作?

①设计组件数量,设计应用页面到底该由哪些组件构成,组件的子组件数量

   组件的划分遵循单一责任原则。

②Redux的状态数的设计,(结合Demo2)

③路由的设计,页面的组合方式(结合Demo2)

④是不是需要使用Native代码配合

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容