在RN開發(fā)中我們會遇到一些Android中已經(jīng)寫好的一些功能,在RN中,我們也要用,所以RN為我們提供了原生模塊。接下來帶大家了解一下原型模塊的制作過程以及!
首先,我們要知道三個主要的類:
? ? 1.ReactContextBaseJavaModule
? ? 2.ReactPackage
? ? 3.MainApplication
這三個類是我們在安卓中需要用到的一些類。下面我們利用Android中的Toast為例:
第一步:創(chuàng)建一個類去繼承ReactContextBaseJavaModule,實現(xiàn)方法getName,作用是返回給RN項目調(diào)用的名稱。
? ? ? ? ? ? ?? 構(gòu)造方法是必須要實現(xiàn)的。還有一個getConstants,這個方法是選擇性的實現(xiàn),它的作用是用來傳遞一些參數(shù),利用Map集合來傳遞參數(shù)例如:
? ? ? ? ? ? ? ?@Nullable
????????????????@Override
? ? ? ? ? ? ? ? public Map getConstants() {
????????????????????Map map =new HashMap<>();
????????????????????map.put(LONG_KEY,Toast.LENGTH_LONG);
????????????????????map.put(SHORT_KEY,Toast.LENGTH_SHORT);
????????????????????return map;
????????????????}
? ? ? ? ? ? ? ? 這個方法中,我將成員變量LONG_KEY和SHORT_KEY作為查找的key,將Toast中的LENGTH_LONG和LENGTH_SHORT作為了值,意思就是在RN中可以通過LONG_KEY中的值來進行調(diào)用。
第二步:@ReactMethod這個注解來聲明方法,可以在RN項目中被調(diào)用,例如:
? ? ? ? ? ? ?@ReactMethod
????????????public void show(String content , int time){
????????????????Toast.makeText(getReactApplicationContext(), content, time).show();
????????????}
? ? ? ? ? ? content就是在RN項目中傳遞的需要Toast的數(shù)據(jù),而time就是顯示的時長
第三步:寫一個類去實現(xiàn)ReactPackage這個接口,會重寫兩個方法createNativeModules和createViewManagers
????????????????createNativeModules:用來在注冊導(dǎo)入RN的原生模塊
????????????????createViewManagers:用來導(dǎo)入RN原生組件
? ? ? ? ? ? ? ? 我們用到的是第一個方法createNativeModules,非常簡單,只需要創(chuàng)建一個List集合將我們剛剛寫好的ReactContextBaseJavaModule的子類創(chuàng)建對象添加到集合中即可,在第二個方法最好不要默認返回空,雖然我們用不到,但是RN項目可能會調(diào)用到這個方法,為了防止控制針異常的出現(xiàn),我們創(chuàng)建一個集合返回一個沒有內(nèi)容的集合(注意:是空內(nèi)容集合不是沒有創(chuàng)建過得集合對象),例如:
????????????????public class MyPackage implements ReactPackage {
????????????????????@Override
????????????????????public List createNativeModules(ReactApplicationContext reactContext) {
????????????????????????List li =new ArrayList<>();
????????????????????????li.add(new MyView(reactContext));
????????????????????????return li;
????????????????????}
????????????????@Override
????????????????public List createViewManagers(ReactApplicationContext reactContext) {
????????????????????List li =new ArrayList<>();
????????????????????li.add(new com.helloworld.ViewManager());
????????????????????return li;
????????????????}
????????????}
第三步:我們直接打開MainApplication這個類,找到getPackages這個方法將我們的MyPackage類注冊到里面就可以了,例如:
????????????@Override
????????????protected List getPackages() {
????????????????return Arrays.asList(
????????????????????new MainReactPackage(),new MyPackage()
????????????????);
????????????}
做好以上三步,我們的安卓項目就正式搭建完成了!??!
。
。
。
當然只搭建Android項目是不夠的,我們還不會在RN項目中進行引用,那么接下來,帶大家學習一下,RN項目如何引用原生模塊!
我們只需要在RN導(dǎo)入組件的地方注冊NativeModules組件就完成了第一步
第二步是正式引用,直接在需要引用的地方調(diào)用,調(diào)用方法如下:
????????NativeModules.MyToast.show("內(nèi)容",NativeModules.MyToast.SHORT );
其中NativeModules.MyToast的意思是獲取到安卓項目中,繼承了ReactContextBaseJavaModule類 的類 的對象,也就是MyView(這是我們寫的第一個類)類。
第二個參數(shù)NativeModules.MyToast.SHORT的意思是,就不用說了吧,就是用對象調(diào)用靜態(tài)的成員變量,而調(diào)用show方法也是這樣的道理。
RN中我是這樣做示范的:
<Text? style={styles.welcome}
? ? ?? onPress={() => {
? ? ? ? ? ? NativeModules.MyToast.show("Toast的內(nèi)容", 0);
? ? ? ? }}>
? ? ? ? ? Welcome to React Native!
? ? ? ? </Text>
這樣我們的一個簡單的原型模塊就完成了。