react-nativeReact Native其他

[React Native]原生模块(上)

2016-05-19  本文已影响1492人  zhuhf

正如上篇文章[React Native]移植原生Android项目中提到,ReactNative目前更多的是用于在原生App中加入一个新的模块。那么,此时如果这个ReactNative模块需要使用到一些原生模块的功能,比如访问平台的API;或者你要复用现成的Java代码;又或者使用Java已经成熟的第三方Library,那么这篇文章会一步步告诉你,如何去调用一个已经封装好的Android原生代码。

实际上,正如上篇文章[React Native]移植原生Android项目中提到,目前更多的还是使用React来做V的工作,那么诸如网络请求之类还是通过在ReactNative模块中调用原生已经封装好的库来实现(据说饿了么目前就是这个方案~)

为了更好的理解,本文演示如何在ReactNative中使用Android平台的Toast功能。

Java中的方法需要导出才能给JS使用,要导出Java方法,需要使用@ReactMethod来注解,且方法的返回值只能是void
@ReactMethod
public void show(String message, int duration) {
Toast.makeText(getReactApplicationContext(), message, duration).show();
}
这样,我们的原生模块已经创建完毕,下面需要注册原生模块了。

我们新建的MyReactPackager,需要在MainActivitygetPackages中注册并返回。

  /**
   * A list of packages used by the app. If the app uses additional views
   * or modules besides the default ones, add more packages here.
   */
  @Override
  protected List<ReactPackage> getPackages() {
    return Arrays.<ReactPackage>asList(
        new MainReactPackage(),
        new MyReactPackager() // 这是我们自定义的ReactPackager
    );
  }

到此原生模块的工作已经告一段落,下面让我们看下如下在ReactNative中调用我们的原生模块。

JS文件中,引入我们步骤二中新建的原生模块ToastAndroid

  var ToastAndroid = require('ToastAndroid');

TouchableOpacity点击方法为onPressButton,它会调用原生模块导出的show方法。

  onPressButton() {
    ToastAndroid.show('Android Toast', ToastAndroid.SHORT);
  }

让我们运行下项目,最终效果图如下:

device-2016-05-19-221758_0-24.gif

本文的源码地址Demo2

下一篇文章会介绍JS调用原生模块的高级用法,敬请期待~

上一篇 下一篇

猜你喜欢

热点阅读