React-Native 自封裝原生模組
React-Native 出現也有一段時間了,其實我們在一些應用中已經接觸過基於它的或效果類似於它的App,如手機淘寶。在每年雙十一時我們會發現沒有更新app也會有一些不同的介面。當然你可能認為WebView也可以做到這些。但實際上RN與WebView是不同的,RN的控制元件正如其名字中的Native描述,是原生的。還有據說微信的小程式也是基於RN做的。甚至有人說RN是移動開發的未來。就本人看來,RN確實在UI開發上提供了一種新的思路,新生的東西學一些沒有什麼壞處,萬一趕上時代了呢?
進入正題。在RN中文網上看了原生模組的的介紹,按著原文的指導敲了一遍,發現有些不太一樣特此在這記錄分享一下。
我發現我的排版跟shi一樣
首先在這裡說明一下,我是先在Android Studio(AS)中新建的空白工程,然後再一步步搭建RN的,如果客官是Clone的RN的demo工程然後修改的,建議還是觀看官方教程。
(假設電腦中已經裝好RN的環境了)
①、進入工程根目錄:npm init(可以直接在AS的Terminal中npm init)
②、npm install –save react react-native(執行完這條指令後注意了,會讓你輸入一系列資訊,跟著輸入就好,預設的直接enter鍵,這步生成package.json)。
③、在package.json的script欄位加入”start”: “node node_modules/react-native/local-cli/cli.js start”(注意該加逗號的地方加逗號)
④、根目錄手動建立index.android.js,然後新增一堆程式碼。
以上步驟我基本粗略說說,可以看官網教程嵌入到已有應用
接下來的問題出現概率就比較大了
⑤、在自己工程build.gradle(app)中新增依賴
dependencies {
...
compile "com.facebook.react:react-native:+" // From node_modules.
}
⑥、在工程Build.grade(Project)中新增(注意:如果你的node_modules資料夾在工程根目錄中,就是$rootDir/node_modules/react-native/android”的格式)。
allprojects {
repositories {
...
maven {
// All of React Native (JS, Android binaries) is installed from npm
url "$rootDir/../node_modules/react-native/android"
}
}
...
}
⑦、接下來就是新增許可權宣告,註冊除錯用的Activity,一定在Application標籤下注冊,然後新增一些原聲程式碼什麼的,可以直接看上面的嵌入的官網連結,還是直奔主題
開始封裝我們的ToastJS原聲模組。
這個模組也是模仿官方教程來的。
⑧、註冊模組之前官方說的都沒什麼問題,可以照著做都是一樣的。然後註冊模組這裡,我們建立了一個自己模組專屬的類。
package cn.scrovor.gogoo.Modules;
import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.JavaScriptModule;
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;
public class ScrovorReactPackage implements ReactPackage {
@Override
public List<Class<? extends JavaScriptModule>> createJSModules() {
return Collections.emptyList();
}
@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
return Collections.emptyList();
}
@Override
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
List<NativeModule> modules = new ArrayList<>();
modules.add(new ToastJS(reactContext));
return modules;
}
}
然後官方說在MainApplication中進行返回該Package資訊,但我們自己寫的可能根本就沒有啊?!
其實自己寫的可以在這裡進行同樣操作。
mReactRootView = new ReactRootView(this);
mReactInstanceManager = ReactInstanceManager.builder()
.setApplication(getApplication())
.setBundleAssetName("index.android.bundle")
.setJSMainModuleName("index.android")
.addPackage(new MainReactPackage())
.addPackage(new ScrovorReactPackage())
.setUseDeveloperSupport(BuildConfig.DEBUG)
.setInitialLifecycleState(LifecycleState.RESUMED)
.build();
然後就java部分的就完成了。
⑨、在JS部分封裝成模組,原官方沒有說清怎麼封裝,以及封裝模組如何放置。這裡說一下。
根目錄新建 Toast.js檔案,放入如下程式碼:
'use strict';
import {NativeModules} from 'react-native';
// ToastJS 對應自己寫的原生控制元件
export default NativeModules.ToastJS;
然後再index.android.js中呼叫
import ToastJS from './ToastJS.js';
...
const onButtonPressed = () =>{
ToastJS.show("my native Component");
};
當然你也可以自己新建一個資料夾放置自己的原聲模組,然後import時路徑寫對就可以了。
Demo的GitHub地址,有幫助的話記得Star奧。老鐵沒毛病吧。