在我们做ReactNative项目的过程中,我们会发现由ReactNative提供给我们的组件或API往往满足不了我们的需求,常常需要我们自己去封装Native组件。
  
  今天我们介绍下如果封装一个简单的ReactNative组件,Native代码采用Android。
  
  需求:实现一个组件、实现类似Android的Toast功能。
  
  1、创建一个RN project
  
  [javascript] view plain copy 在CODE上查看代码片派生到我的代码片
  
  react-native init HybridDemo
  
  如下:
  
  [html] view plain copy 在CODE上查看代码片派生到我的代码片
  
  $ react-native init HybridDemo
  
  This will walk you through creating a new React Native project in /Users/birenjie/RN/projects/HybridDemo
  
  Installing react-native package from npm...
  
  Setting up new React Native app in /Users/www.lxinyul.cc birenjie/RN/projects/HybridDemo
  
  HybridDemo@0.0.1 /Users/birenjie/RN/projects/HybridDemo
  
  └── react@15.3.2
  
  To run your app on iOS:
  
  cd /Users/birenjie/RN/projects/HybridDemo
  
  react-native run-ios
  
  - or -
  
  Open /Users/birenjie/RN/projects/HybridDemo/ios/HybridDemo.xcodeproj in Xcode
  
  Hit the Run button
  
  To run your app on Android:
  
  Have an Android emulator running (quickest way to get started), or a device connected
  
  cd /Users/birenjie/RN/projects/HybridDemo
  
  react-native run-android
  
  2、使用Android Studio打开新建的项目HybridDemo,新建一个空Library
  
  如何新建一个Android的空Library,参考:Android Studio中为项目新建及添加Library
  
  在这里我新建了一个Libray : rn-toast-android
  
  3、修改rn-toast-android下的build.gradle, 在dependencies中添加compile 'com.facebook.React:react-native:0.20.+'
  
  如下:
  
  4、在Library中新建AndroidToastModule.Java和AndroidToastPackage.java
  
  AndroidToastModule.java代码如下:
  
  [java] view plain copy 在CODE上查看代码片派生到我的代码片
  
  package com.example.rn_toast_android;
  
  import android.widget.Toast;
  
  import com.facebook.react.bridge.ReactApplicationContext;
  
  import com.facebook.react.bridge.ReactContextBaseJavaModule;
  
  import com.facebook.react.bridge.ReactMethod;
  
  import com.facebook.react.common.MapBuilder;
  
  import java.util.Map;
  
  /**
  
  * Created by birenjie on 16/10/11.
  
  */
  
  public class AndroidToastModule extends ReactContextBaseJavaModule {
  
  private static final String DURATION_SHORT_KEY = "SHORT";
  
  private static final String DURATION_LONG_KEY = "LONG";
  
  public AndroidToastModule(www.hsl85.cn/ ReactApplicationContext reactContext) {
  
  super(reactContext);
  
  }
  
  @Override
  
  public String getName() {
  
  return "ToastForAndroid";
  
  }
  
  @Override
  
  public Map<String, Object> getConstants() {
  
  final Map<String, Object> constants = MapBuilder.newHashMap();
  
  constants.put(DURATION_SHORT_KEY, Toast.LENGTH_SHORT);
  
  constants.put(DURATION_LONG_KEY, Toast.LENGTH_LONG);
  
  return constants;
  
  }
  
  @ReactMethod
  
  public void show(String message, int duration) {
  
  Toast.makeText(getReactApplicationContext(), message, duration).show();
  
  }
  
  }
  
  AndroidToastPackage.java代码如下:
  
  [java] view plain copy 在CODE上查看代码片派生到我的代码片
  
  package com.example.rn_toast_android;
  
  import com.example.rn_toast_android.AndroidToastModule;
  
  import com.facebook.react.ReactPackage;
  
  import com.facebook.react.bridge.JavaScriptModule;
  
  import com.facebook.react.bridge.NativeModule;
  
  import com.facebook.react.bridge.ReactApplicationContext;
  
  import com.facebook.react.uimanager.ViewManager;
  
  import java.util.Arrays;
  
  import java.util.Collections;
  
  import java.util.List;
  
  /**
  
  * Created by birenjie on 16/10/11.
  
  */
  
  public class AndroidToastPackage implements ReactPackage {
  
  @Override
  
  public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
  
  return Arrays.<NativeModule>asList(new AndroidToastModule(reactContext));
  
  }
  
  //一般情况createJSModules()的返回值都是空集合。
  
  @Override
  
  public List<Class<? extends JavaScriptModule>> createJSModules() {
  
  return Collections.emptyList();
  
  }
  
  //如果是BaseViewManager或其子类,那么createViewwww.zhenlyule.cn/ Managers()中返回的就是加入了BaseViewManager的集合
  
  @Override
  
  public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
  
  return Collections.emptyList();
  
  }
  
  }
  
  5、生成package.json
  
  在....android/rn-toast-android/目录下 执行npm init
  
  会出现一系列的提示,按照提示完成,最后可以生成package.json 文件
  
  6、测试我们编写的组件
  
  在我们init的项目的根目录(index.android.js)同级目录,新建ToastForAndroid.js
  
  ToastForAndroid.js源码如下:
  
  [javascript] view plain copy 在CODE上查看代码片派生到我的代码片
  
  'use strict';
  
  import React, { Component } from 'react';
  
  import {
  
  NativeModules,
  
  } from 'react-native';
  
  const {ToastForAndroid} = NativeModules;
  
  var ToastForAndroidDemo = {
  
  SHORT: ToastForAndroid.SHORT,
  
  LONG: ToastForAndroid.LONG,
  
  show: function (
  
  message: string,
  
  duration: number
  
  ): void {
  
  ToastForAndroid.show(message, www.ycyc66.cn/ duration);
  
  },
  
  };
  
  module.exports = ToastForAndroidDemo;
  
  修改index.android.js,如下:
  
  [javascript] view plain copy 在CODE上查看代码片派生到我的代码片
  
  /**
  
  * Sample React Native App
  
  * https://github.com/facebook/react-native
  
  * @flow
  
  */
  
  import React, { Component } from 'react';
  
  import {
  
  AppRegistry,
  
  StyleSheet,
  
  Text,
  
  View,
  
  Dimensions,
  
  TouchableHighlight,
  
  } from 'react-native';
  
  import ToastForAndroid from './ToastForAndroid';
  
  var deviceWidth = Dimensions.get('window').width;
  
  var deviceHeight = www.zhenloyl88.cn Dimensions.get('window').height;
  
  class HybridDemo extends Component {
  
  render() {
  
  return (
  
  <TouchableHighlight onPress= {()=>ToastForAndroid.show('I am clicked ', ToastForAndroid.LONG)}>
  
  <Text style={{width:deviceWidth,height:50,backgroundColor:'red',textAlign:'center',textAlignVertical:'center'}}>点击调用Native方法</Text>
  
  </TouchableHighlight>
  
  );
  
  }
  
  }
  
  AppRegistry.registerComponent('HybridDemo', () => HybridDemo);
  
  我们需要修改的MainApplication.java,将AndroidToastPackage加入到ReactPackage
  
  [java] view plain copy 在CODE上查看代码片派生到我的代码片
  
  @Override
  
  protected List<ReactPackage> www.wx1677.com/ getPackages() {
  
  return Arrays.<ReactPackage>asList(
  
  new MainReactPackage(),new AndroidToastPackage()
  
  );
  
  }
  
  好,一切准备就绪,我们启动React packager Server。
  
  运行效果如下:
  
  至此,我们自己封装的Android Toast组件就完成了。
  
  如果我们有npm的镜像服务器,我们还可以把我们的组件发布上去。
  
  在..../android/rn-toast-androi www.yghrcp88.cn d/ 目录下执行
  
  $ npm adduser //增加npm用户
  
  $ npm publish //上传组件到npm上
  
  这样我们就可以像使用第三方组件一样,使用自己发布的ReactNative混合组件了。

《React-Native系列》38、 ReactNative混合组件封装的更多相关文章

  1. React Native 系列(九) -- Tab标签组件

    前言 本系列是基于React Native版本号0.44.3写的.很多的App都使用了Tab标签组件,例如QQ,微信等等,就是切换不同的选项,显示不同的内容.那么这篇文章将介绍RN中的Tab标签组件. ...

  2. 【REACT NATIVE 系列教程之十二】REACT NATIVE(JS/ES)与IOS(OBJECT-C)交互通信

    http://blog.csdn.net/xiaominghimi/article/details/51586492 一用到跨平台的引擎必然要有引擎与各平台原生进行交互通信的需要.那么Himi先讲解R ...

  3. React Native之本地文件系统访问组件react-native-fs的介绍与使用

    React Native之本地文件系统访问组件react-native-fs的介绍与使用 一,需求分析 1,需要将图片保存到本地相册: 2,需要创建文件,并对其进行读写 删除操作. 二,简单介绍 re ...

  4. React Native 系列(五) -- 组件间传值

    前言 本系列是基于React Native版本号0.44.3写的.任何一款 App 都有界面之间数据传递的这个步骤的,那么在RN中,组件间是怎么传值的呢?这篇文章将介绍到顺传.逆传已经通过通知传值. ...

  5. React Native系列(6) - 编译安卓私有React-Native代码

    为何要自己编译React Native安卓私有代码 我们在开发中遇到一个HTTP2的问题,React Native安卓客户端在和HTTP2支持的服务器通讯的过程中会有crash,见 React-Nat ...

  6. React Native 系列(二) -- React入门知识

    前言 本系列是基于React Native版本号0.44.3写的,最初学习React Native的时候,完全没有接触过React和JS,本文的目的是为了给那些JS和React小白提供一个快速入门,让 ...

  7. React Native 系列(二)

    前言 本系列是基于React Native版本号0.44.3写的,最初学习React Native的时候,完全没有接触过React和JS,本文的目的是为了给那些JS和React小白提供一个快速入门,让 ...

  8. React Native 系列(八) -- 导航

    前言 本系列是基于React Native版本号0.44.3写的.我们都知道,一个App不可能只有一个不变的界面,而是通过多个界面间的跳转来呈现不同的内容.那么这篇文章将介绍RN中的导航. 导航 什么 ...

  9. React Native 系列(三) -- 项目结构介绍

    前言 本系列是基于React Native版本号0.44.3写的,相信大家看了本系列前面两篇文章之后,对于React Native的代码应该能看懂一点点了吧.本篇文章将带着大家来认识一下React N ...

随机推荐

  1. ASP.NET MVC- VIEW Creating Custom HTML Helpers Part 2

    The goal of this tutorial is to demonstrate how you can create custom HTML Helpers     that you can ...

  2. CAS+SSO原理浅谈

    http://www.cnblogs.com/yonsin/archive/2009/08/29/1556423.htmlSSO 是一个非常大的主题,我对这个主题有着深深的感受,自从广州 UserGr ...

  3. 驱动lx4f120h,头文件配置,没有完全吃透,望指点

    来了块开发板,没接触过,希望能驱动起来,就首先试一下驱动LED,没想到刚开始建好工程问题就来了 使用GPIO驱动,首先想到的是关于GPIO的头文件gpio.h,事实上这个还不够,还需要设置一下系统的配 ...

  4. [翻译] GVUserDefaults

    GVUserDefaults Tired of writing all that code to get and set defaults in NSUserDefaults? Want to hav ...

  5. jquerymobile知识点:select的动态帮定

    代码: <div data-role="navbar"> <ul> <li> <select name="select-choi ...

  6. Android中利用OpenMax 编程的基本流程

    近期因为公司在做数字电视,播放器和模块由供应商打包一起卖,驱动调通了,但是播放器要硬件解码,和平台差异,原厂又没有相关文档,就自己试着看了一个系统的播放器流程,顺便整理了一下,也方便以后查询,希望对播 ...

  7. python如何使用 os.path.exists()--Learning from stackoverflow 分类: python 2015-04-23 20:48 139人阅读 评论(0) 收藏

    Q&A参考连接 Problem:IOError: [Errno 2] No such file or directory. os.path.exists() 如果目录不存在,会返回一个0值. ...

  8. JAVA格式化时间日期

    JAVA格式化时间日期 import java.util.Date; import java.text.DateFormat; /** * 格式化时间类 * DateFormat.FULL = 0 * ...

  9. RTB日志分析MR程序设计

    到新公司三个月了,上个月做的是Beacon项目,详细的设计思想还没有写文档.这两周开始搞Hadoop,开始阅读相关论文.开始编写MR程序.开始写java,大学时用java较多,工作后就一直在用c/c+ ...

  10. Day01 - Python 基础介绍

    1 Python 简介 1.1 Python 的由来 Python的创始人:吉多·范罗苏姆(Guido van Rossum) 1989年,吉多·范罗苏姆为了在阿姆斯特丹打发圣诞节假期时间,开发的一个 ...