美文网首页
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爬坑之旅

    1.搭建环境 react-native必须的依赖有Node、React Native 命令行工具、Python2 ...

  • react-native组件学习

    react-native组件爬坑 activityIndicatoranimating属性如果一开始为false的...

  • React-Native 爬坑

    一、红屏 unable to load script from assets ‘index.android bun...

  • Vue爬坑之旅

    1.axios赋值的问题 描述:前后数据对接,使用nuxt整合的axios,使用vue中的钩子函数在页面组件挂载完...

  • TensorFlowOnSpark爬坑之旅

    写前碎碎念 小编leader安排一个任务,在TensorFlowOnSpark上运行一个可以run的demo,入职...

  • fragment 爬坑之旅

    参考:https://zhuanlan.zhihu.com/p/20660984 0.使用fragment时,注意...

  • Flutter爬坑之旅

    项目地址(github) 工作略忙,进度稍慢。以下把过程中的一些关键点总结一下: 1、项目开发时,Android ...

  • react-native 爬坑经历

    常见问题总结: react native 常见问题总结 - 简书 1. unable to load script...

  • react-native 小旅途(1)

    1.按照这个官方坑爹指南 react-native中文网 开始入坑,按照react-native,android ...

  • React-Native爬坑中(Redux)

    介绍一下我在之前项目中是如何使用redux的。 redux学习:http://www.ruanyifeng.com...

网友评论

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

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