美文网首页
React Native 入门踩坑(Android)

React Native 入门踩坑(Android)

作者: zoeykkkk | 来源:发表于2019-07-09 20:47 被阅读0次

    最近因为业务需要,用了一波RN开发安卓移动端的App,业务场景主要是给工厂现场管理使用的,踩坑经历如下

    0. 真机调试常用命令
    adb devices //判断设备连接状态
    adb shell input keyevent 82 //显示操作菜单
    
    1.没有找到对应的SDK

    对策:从androidStudio根目录中,复制一份local.properties到项目根目录中去就可以了(android的文件夹)

    2.RN- FlatList 更新数据不刷新
    <FlatList
      data={this.state.goodList}
      renderItem={this.renderItem}
      extraData={this.state} //保证state.selected变化时,能够正确触发FlatList的更新
    />
    
    3.RN调取Android代码(参考官网,讲的很详细,就不搬运了)

    https://reactnative.cn/docs/native-modules-android/

    4.RN中安卓调用第三方so库
    1. 工程android/app/build.gradle目录中的android属性中添加
        sourceSets {
            main {
                jniLibs.srcDirs = ['libs']
            }
        }
    

    2.工程android/app/目录下新建libs文件夹
    根据不同的CPU类型,我项目使用的是armeabi,然后我把以前路径下的so库(~\android\app\build\intermediates\transforms\mergeJniLibs\debug\0\lib\armeabi)全部复制到这个文件夹下面,还有一个文件夹armeabi-v7a也要,但里面是空的,不知道为啥删了报错


    1. 可能遇到CPU位数的报错,解决是在工程android/app/build.gradle目录中defaultConfig 属性下添加如下代码
        defaultConfig {
            //限定CPU架构的so库
            ndk {
                abiFilters "armeabi"
            }
        }
    
    5.弹出键盘时组件会上浮
    6.Android向RN发送数据

    Android端代码

    package com.jugg;
    
    import com.facebook.react.bridge.ReactApplicationContext;
    import com.facebook.react.bridge.ReactContext;
    import com.facebook.react.bridge.ReactContextBaseJavaModule;
    
    import javax.annotation.Nonnull;
    //获取RN上下文
    public class ReactContextModule extends ReactContextBaseJavaModule {
      public static ReactContext rContext;
      public ReactContextModule(@Nonnull ReactApplicationContext reactContext) {
        super(reactContext);
        rContext = reactContext;
      }
    
      @Nonnull
      @Override
      public String getName() {
        return null;
      }
    }
    //向RN端发送数据
    public void sendEventToRN(String eventName, @NonNull String params){
        ReactContextModule.rContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit(eventName, params);
      }
    

    RN端代码

      componentDidMount() {
        //获取安卓广播code
        this.subscription = DeviceEventEmitter.addListener('RNnotification', this.receiveBarcode)
      }
    
      componentWillUnmount() {//取消监听
        this.subscription.remove()
      }
    
    7.在线预览服务端PDF

    方案一:使用第三方库 react-native-pdf,官网讲的很详细
    react-native-pdf 传送门

    方案二:在使用方案一时候按照官网的配置遇到JAVA库调用报错,由于不大懂原生开发,可能自己的各种环境特殊,就卡住了,换了个变通的,用react-native-webview和PDF.js配合来实现(比较low)
    疑问:

    import React, { Component } from 'react';
    import { WebView } from 'react-native-webview';
    
    export default class MyWeb extends Component {
      render() {
        return (
          <WebView source={{ uri: 'http://x.x.x.x:8888/PDF.js/web/viewer.html?file=http://x.x.x.x:8888/x.pdf' }}
          />
        );
      }
    }
    
    8.谷歌浏览器中无法查看网络请求消息

    对策:我是用的axios,在入口文件index.js中增加一行

    GLOBAL.XMLHttpRequest = GLOBAL.originalXMLHttpRequest || GLOBAL.XMLHttpRequest
    

    相关文章

      网友评论

          本文标题:React Native 入门踩坑(Android)

          本文链接:https://www.haomeiwen.com/subject/rivzhctx.html