React Native爬過的坑

1哪审、小米手機上跑RN,先去把開發(fā)者選項中的MIUI優(yōu)化選項關(guān)閉掉虑瀑;
2湿滓、在調(diào)試的時候,一enable remote JS debug就閃退舌狗,這個根本原因目前不知道是啥叽奥,控制臺android和IOS也是輸出了不一樣的日志,到官網(wǎng)的issue上也沒發(fā)現(xiàn)實質(zhì)的解決方式痛侍,后來更新了下rn版本朝氓,重新npm install,又好了主届,這個要持續(xù)跟進(jìn)赵哲;
3、react navigation reset的問題

在使用react navigation reset的時候岂膳,會導(dǎo)致component的生命周期執(zhí)行多次誓竿,經(jīng)過不斷的排查,最終發(fā)現(xiàn)問題是在setparams上面谈截,所以筷屡,如果在A頁面要reset到B頁面,而B頁面又要進(jìn)行setparam簸喂,那么毙死,一定要進(jìn)行適當(dāng)?shù)难訒r,否則喻鳄,A的生命周期會執(zhí)行多次扼倘。

    let that = this;
    this.timer = setTimeout(
      () => { 
        console.log("111111111111111111111111111111111111111")
        that.props.navigation.setParams({
          isCurrentTasks: that.state.isCurrentTasks,
          navigatePress: that.loadData,
        });
        that.timer && clearTimeout(that.timer);
      },300
    );
4、android建立原生組件除呵,供reactnative調(diào)用

4.1)定義一個Module再菊,集成ReactContextBaseJavaModule:

package com.study03.custommodules;

import android.widget.Toast;

import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.module.annotations.ReactModule;
import com.facebook.react.modules.core.DeviceEventManagerModule;
import com.facebook.react.modules.storage.AsyncStorageModule;
import com.facebook.react.uimanager.PixelUtil;

import java.util.Map;

/**
 * @author LuoZheng
 * @date 2018/1/15 10:11
 */
@ReactModule(name = HelloModule.NAME)
public class HelloModule extends ReactContextBaseJavaModule {

    public static final String NAME = "HelloModule";
    private ReactContext context;

    public HelloModule(ReactApplicationContext reactContext) {
        super(reactContext);
        this.context = reactContext;
        notifyReactNative();
    }

    /**
     * 無需ReactNative調(diào)用,直接發(fā)送信息給ReactNative
     * @param eventName
     * @param params
     */
    public  void sendEvent(String eventName, WritableMap params) {
        context.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit(eventName,params);
    }

    private void notifyReactNative(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(10 * 1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                WritableMap et= Arguments.createMap();
                et.putString("eventParams", "Hello Event");
                sendEvent("HelloEvent",et);
            }
        }).start();
    }

    /**
     * 這個是在reactnative引用的名字:
     * @return
     */
    @Override
    public String getName() {
        return NAME;
    }

    @Override
    public Map<String, Object> getConstants() {
        return super.getConstants();
    }

    /**
     * 參數(shù)類型Java -> JavaScript
     * Boolean -> Bool
     * Integer -> Number
     * Double -> Number
     * Float -> Number
     * String -> String
     * Callback -> function
     * ReadableMap -> Object
     * ReadableArray -> Array
     * @param message
     */
    @ReactMethod
    public void hello(String message){
        Toast.makeText(getReactApplicationContext(),message,Toast.LENGTH_LONG).show();
    }

    /**
     * 回調(diào)方式把結(jié)果返給react native
     * @param message
     * @param callback
     */
    @ReactMethod
    public void callback(final String message,final Callback callback){
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                callback.invoke(message + ",Hello Callback!");
            }
        }).start();
    }

    /**
     * Promise 方式把結(jié)果返回給React native
     * @param message
     * @param promise
     */
    @ReactMethod
    public void promise(final String message , final Promise promise){
        WritableMap map = Arguments.createMap();
        map.putString("result", message + ",Hello Promise");
        promise.resolve(map);
//        new Thread(new Runnable() {
//            @Override
//            public void run() {
//                try {
//                    Thread.sleep(5000);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//                WritableMap map = Arguments.createMap();
//                map.putString("result", message + ",Hello Promise");
//                promise.resolve(map);
//            }
//        }).start();
    }
}

4.2) 創(chuàng)建一個ReactPackage:

package com.study03.custommodules;

import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * $Desc$
 *
 * @author LuoZheng
 * @date 2018/1/15 10:23
 */

public class HelloPackage implements ReactPackage {

    /**
     * 這個是用來返回特定的module
     * @param reactContext
     * @return
     */
    @Override
    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
        List<NativeModule> nativeModules = new ArrayList<>();
        nativeModules.add(new HelloModule(reactContext));
        return nativeModules;
    }

    /**
     * 這個用來指定特定module的一些view屬性配置信息
     * @param reactContext
     * @return
     */
    @Override
    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
        return Collections.emptyList();
    }
}

4.3) 在ReactNativeHost中注冊package:

 @Override
    protected List<ReactPackage> getPackages() {
      return Arrays.asList(
          new MainReactPackage(),
              new HelloPackage()
      );
    }

4.4) module 導(dǎo)出:

import React, { Component } from 'react'
import { NativeModules } from 'react-native'

module.exports = NativeModules.HelloModule;

4.5)使用:

/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 * @flow
 */

import React, { Component } from 'react';
import {
  Platform,
  StyleSheet,
  Text,
  View,
  DeviceEventEmitter,
} from 'react-native';

import HelloModule from './Hello'

const instructions = Platform.select({
  ios: 'Press Cmd+R to reload,\n' +
  'Cmd+D or shake for dev menu',
  android: 'Double tap R on your keyboard to reload,\n' +
  'Shake or press menu button for dev menu',
});

export default class App extends Component {

  componentDidMount() {
    HelloModule.hello("Hello React Native World !");

    // Callback 回調(diào)方式獲取Native結(jié)果
    HelloModule.callback("你好",
      (message) => {
        console.log("@@@@@@@@@@@@@ 111:" + message);
      }
    );

    // Native 主動向ReactNative發(fā)送消息
    DeviceEventEmitter.addListener("HelloEvent", function (event) {
      console.log("@@@@@@@@@@@@@ 222:%O", event)
    });
  }

  /**
   * async 標(biāo)識promiseTest是一個異步方法
   */
  async promiseTest() {

    // await 表示要等到promise方法執(zhí)行結(jié)束之后颜曾,才會往后執(zhí)行
    // Promise 方式獲取Native結(jié)果
    let { result } = await HelloModule.promise("你好");

    console.log("@@@@@@@@@@@@@ 333:" + result);

  }

  render() {
    return (
      <View style={styles.container}>
        <Text style={styles.welcome}>
          Welcome to React Native!
        </Text>
        <Text style={styles.instructions}>
          To get started, edit App.js
        </Text>
        <Text
          style={styles.instructions}
          onPress={this.promiseTest.bind(this)}>
          {instructions}
        </Text>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
  },
  welcome: {
    fontSize: 20,
    textAlign: 'center',
    margin: 10,
  },
  instructions: {
    textAlign: 'center',
    color: '#333333',
    marginBottom: 5,
  },
});

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纠拔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子泛豪,更是在濱河造成了極大的恐慌稠诲,老刑警劉巖侦鹏,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異臀叙,居然都是意外死亡略水,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門劝萤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來渊涝,“玉大人,你說我怎么就攤上這事稳其∈簧停” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵既鞠,是天一觀的道長。 經(jīng)常有香客問我盖文,道長嘱蛋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任五续,我火速辦了婚禮洒敏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘疙驾。我一直安慰自己凶伙,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布它碎。 她就那樣靜靜地躺著函荣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪扳肛。 梳的紋絲不亂的頭發(fā)上傻挂,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天,我揣著相機與錄音挖息,去河邊找鬼金拒。 笑死,一個胖子當(dāng)著我的面吹牛套腹,可吹牛的內(nèi)容都是我干的绪抛。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼电禀,長吁一口氣:“原來是場噩夢啊……” “哼幢码!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鞭呕,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤蛤育,失蹤者是張志新(化名)和其女友劉穎宛官,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瓦糕,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡底洗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了咕娄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亥揖。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖圣勒,靈堂內(nèi)的尸體忽然破棺而出费变,到底是詐尸還是另有隱情,我是刑警寧澤圣贸,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布挚歧,位于F島的核電站,受9級特大地震影響吁峻,放射性物質(zhì)發(fā)生泄漏滑负。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一用含、第九天 我趴在偏房一處隱蔽的房頂上張望矮慕。 院中可真熱鬧,春花似錦啄骇、人聲如沸痴鳄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽痪寻。三九已至,卻和暖如春明未,著一層夾襖步出監(jiān)牢的瞬間槽华,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工趟妥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留猫态,地道東北人。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓披摄,卻偏偏與公主長得像亲雪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子疚膊,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,309評論 25 707
  • react-navigation導(dǎo)航組件使用詳解 注意了义辕,如果有小伙伴們發(fā)現(xiàn)運行作者提供的react-naviga...
    光強_上海閱讀 23,468評論 38 103
  • 簡短說明 收錄一些好用的RN第三方組件,以方便日常的使用寓盗,大家有什么推薦的也可以跟我說灌砖,我加進(jìn)去璧函。如有冒犯,可以聯(lián)...
    以德扶人閱讀 43,650評論 44 214
  • 第九次換藥結(jié)束,順嘴問問護士還需要換多久撩幽。護士淡淡地說:也有換半年的库继,這是一個反復(fù)的病。前幾次的心理建設(shè)瞬間崩塌窜醉,...
    英子同學(xué)閱讀 131評論 0 0
  • 我們是家跨境電商平臺榨惰,老板做了將近30年的制造業(yè)拜英,在13年跨境電商風(fēng)口旺盛時,毅然決然的加入了跨境電商大軍 但是做...
    teresa12閱讀 271評論 1 0