美文网首页
React-Native爬坑之旅

React-Native爬坑之旅

作者: 会飞的猪l | 来源:发表于2018-12-25 11:37 被阅读17次

    1.搭建环境

    react-native必须的依赖有Node、React Native 命令行工具、Python2 以及 JDK 和 Android Studio。安装Android Studio时,一定要科学上网,不让你会发现根本没办法继续。(Node 的版本必须高于 8.3,Python 的版本必须为 2.x(不支持 3.x),而 JDK 的版本必须是 1.8(目前不支持 1.9 及更高版本))
    java环境报错,和weex不一样的时,react-native打包依赖java编译环境,也就是javac,如果你只安装啦java没有安装javac那就在安装一下吧,安装完之后,有可能会报一个找不到tools.jar文件,这个文件只有javac这个安装目录里面有,复制出来放到java的lib里面就OK啦。

    2.运行

    运行的话必须要有一个模拟器,你可以下载一个模拟器,也可以使用Android Studio打开一个模拟器,使用

    react-native run-android
    

    在设备上运行,现在你应该就运行了这个项目啦。只需要手动修改代码,在模拟器中双击R就可以进行刷新啦。

    3.打包APK

    react-native打包APK,必须要一个签名密钥,(没有也可以打包,但是不能安装),打开命令行

    keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000
    

    在JAVA的bin目录里面执行,否则你会看到没有keytool命令(你也可以把java bin配置环境变量)
    这句话的意思是密钥库里生成了一个单独的密钥,有效期为 10000 天。它会让你做一些配置配置会生成一个my-release-key.keystore文件(这个配置不能写中文!!!,会配置2个密码)生成之后记住你输入的密码,把这个文件放到RN目录android中的APP里面。然后在android里面的gradle.properties文件里面写

    MYAPP_RELEASE_STORE_FILE=my-release-key.keystore
    
    MYAPP_RELEASE_KEY_ALIAS=my-key-alias
    
    MYAPP_RELEASE_STORE_PASSWORD=**** //你刚写的密码
    
    MYAPP_RELEASE_KEY_PASSWORD= ****  //你刚写的密码
    

    修改android/app/build.gradle文件signingConfigs里面的release这个字段和buildTypes里面的release 添加字段

    def enableProguardInReleaseBuilds = true
    
    android {
    ...
        defaultConfig {
    ....
        }
        signingConfigs {
        release {
          storeFile file(MYAPP_RELEASE_STORE_FILE)
          storePassword MYAPP_RELEASE_STORE_PASSWORD
          keyAlias MYAPP_RELEASE_KEY_ALIAS
          keyPassword MYAPP_RELEASE_KEY_PASSWORD
        }}
        splits {
    ....
        }
        buildTypes {
            release {
                signingConfig signingConfigs.release
               ...
            }
        }
      .....
                }
            }
        }
    }
    

    然后在android目录下跑

    gradlew assembleRelease
    
    image.png

    4.echatrs图表打包无效

    在node_modules里面找到natives-echarts包下的tpl.html文件,复制到android的assets下面,修改index.js的引用方式(没有这个文件建一个)


    image.png
    image.png
    image.png

    5.RN跳转导航

    react-navigation很多博客都写的是老版本的使用方法,在新版本中没有这个StackNavigator全部换成createStackNavigator暴露出去方法必须要createAppContainer执行一个这个

    import React from 'react';
    import {Text,View,Button} from 'react-native';
    import Login from './../login/login';
    
    //坑  新版本 不支持StackNavigator全部换成createStackNavigator
    import { createStackNavigator,createAppContainer  } from 'react-navigation';
    // import ThreeScreen from './Three.js';
    
    
    
    class ChatScreen extends React.Component {
    static navigationOptions = {
      title: 'Chat with Lucy',
      };
      render() {
        const { navigate } = this.props.navigation;
        return (
        <View>
          <Text>Chat with Lucy</Text>
          <Button
          onPress={() => navigate('Three')}
          title="to to ThreeScreen"
          />
        </View>
        );
      }
    }
    
    const Board = createStackNavigator({
      Login: { screen: Login },
      Chat: { screen: ChatScreen },
    // Three: { screen: ThreeScreen},
    },
     {//定义配置
        initialRouteName: 'Login',     //设置初始路由为Home
      }
      );
    
    export default createAppContainer(Board);
    

    APPjs直接渲染

    import React from 'react';
    import Board from './route/route';
    export default class App extends React.Component {
        render() {
          return <Board />;
        }
    }
    
    

    但是很多情况下他会报一个
    undefined is not an object evaluation 'RNGestureHandlerModule.State
    这样的错误怎么解决呢

    1.删除node_modules和package-lock.json
    2.npm install
    3.npm install --save react-navigation
    4.npm install --save react-native-gesture-handler
    5.react-native link
    

    6.添加gif图片

    默认情况下 Android 是不支持 GIF 和 WebP 格式的。你需要在android/app/build.gradle文件中根据需要手动添加以下模块:

    dependencies {
      // 如果你需要支持Android4.0(API level 14)之前的版本
      compile 'com.facebook.fresco:animated-base-support:1.10.0'
      // 如果你需要支持GIF动图
      compile 'com.facebook.fresco:animated-gif:1.10.0'
      // 如果你需要支持WebP格式,包括WebP动图
      compile 'com.facebook.fresco:animated-webp:1.10.0'
      compile 'com.facebook.fresco:webpsupport:1.10.0'
      // 如果只需要支持WebP格式而不需要动图
      compile 'com.facebook.fresco:webpsupport:1.10.0'
    }
    

    从新启动一下就好啦。

    7.隐藏导航的顶部标题栏

    navigationOptions:{
        header:null,
    }
    

    8.React native android端webview中文乱码解决

     <WebView style={{ width: width - 60, height: 310 * KAdaptionHeight }}
          scalesPageToFit={isTrue}
          bounces={false}
          source={{ html: content.content }}// 部分机子出现乱码
    
    <WebView style={{ width: width - 60, height: 310 * KAdaptionHeight }}
        scalesPageToFit={isTrue}
        bounces={false}
        source={{ html: content.content, baseUrl: '' }}// baseUrl: ''中文乱码解决
    

    9.WebView向RN通信

    //页面写法
        <View style={S.container}>
                  <WebView 
                     originWhitelist={['*']}
                     source={{ html:this.state.data,baseUrl: '' }}  //baseUrl解决乱码问题
                     javaScriptEnabled={true}
                     domStorageEnabled={true}
                     scalesPageToFit={true}
                     startInLoadingState={true}
                     injectedJavaScript ={HTML}
                     onMessage={(event) => this.onMessageaa(event)}
                    />
                    {/* <Histogram></Histogram> */}
      </View>
    //方法
        onMessageaa(event){
    //注意这个一定要event.nativeEvent.data,负责会报错
            ToastAndroid.showWithGravity(event.nativeEvent.data, ToastAndroid.LONG,ToastAndroid.CENTER);
        }   
    //injectedJavaScript ={HTML} 代码  不要用ES6语法
    const HTML = `
        var currentPosition=0,timer;
        timer = setInterval(function(){
             currentPosition+=5;
    
           if(currentPosition < document.body.scrollHeight)
           {
               window.scrollTo(0,currentPosition);
           }
           else
           {
               window.postMessage('currentPosition');
               window.clearInterval(timer);
               window.scrollTo(0,document.body.scrollHeight);
               currentPosition = 0;
               window.scrollTo(0,currentPosition);
           }
       },10)
        `;
    

    10.RN向WebView通信

    //RN里面写
    this.refs.webView.postMessage("你要传的值");
    //HTML里面写
    document.addEventListener('message', function(msg) {})
    

    11.echart渐变

    网页版的echart渐变,RN中没有echarts这个对象所以不行

    areaStyle: {
        normal: {
            color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
                   offset: 0,
                   color: 'rgb(234, 243, 253)'
            }, {
                 offset: 1,
                 color: 'rgb(255, 255, 255)'
             }])
        }
    }
    

    我们可以使用另一种方法

    areaStyle: {
              normal: {
                color: {
                  type: 'linear',
                  x: 0,
                  y: 0,
                  x2: 0,
                  y2: 1,
                  colorStops: [{
                      offset: 0, color: '#A3C7F3'    // 0% 处的颜色
                  }, {
                      offset: 1, color: '#FFFFFF' // 100% 处的颜色
                  }],
                  globalCoord: false // 缺省为 false
                }
              },
              origin:'start'
     }
    

    相关文章

      网友评论

          本文标题:React-Native爬坑之旅

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