實作 Native module

實作原生 Toast 功能

我們的目標是要實作一個能在 React Native 專案獨立呼叫 Android Toast 功能的 native module,所以我們需要把邏輯實作在 RNMyAndroidToastModule.java

.
├──android     
├────manifests   
├────java        
├──────com.reactlibrary
├─────────RNMyAndroidToastModule.java    <-- 這裡
└─────────RNMyAndroidToastPackage.java 
├──ios        
├──index.js   
├──package.json
└──README.md
public class RNMyAndroidToastModule extends ReactContextBaseJavaModule {  

   private final ReactApplicationContext reactContext;  

   // 宣告兩個常數儲存 Toast 的維持時間,以便輸出到 JavaScript
   private static final String DURATION_SHORT_KEY = "SHORT";  
   private static final String DURATION_LONG_KEY = "LONG";  

   // 預設建構子  
   public RNMyAndroidToastModule(ReactApplicationContext reactContext) {  
      super(reactContext);  
      // reactContext 是特殊的 Android Context,是當前 React Native app 的上下文物件  
      this.reactContext = reactContext;  
   }  
   // getName() 為必備方法,負責回傳此 library 名稱  
   // 這裡的名稱一經產生後建議不要再修改,容易出問題   @Override  
   public String getName() {  
     return "MyAndroidToast";  
   }  

   // 宣告可以在 JavaScript 端可以使用的常數  
   // getConstants() 不是必備方法 // 以 Toast 來說,就是它的維持顯示時間 // Toast.LENGTH\_SHORT / Toast.LENGTH\_LONG   @Override  
   public Map<String, Object\> getConstants() {  
     final Map<String, Object\> constants = new HashMap<>();  
     constants.put(DURATION\_SHORT\_KEY, Toast.LENGTH_SHORT);  
     constants.put(DURATION\_LONG\_KEY, Toast.LENGTH_LONG);  
     return constants;  
  }  

   // 在 method 宣告 @ReactMethod 表示該方法將可以被 JavaScript 端存取  
   // 由於 React Native 的 bridge 機制是非同步的,所以回傳必須是 void 
   // 如果需要回傳,必須透過事件機制或是 callback 方法   

   @ReactMethod  
   public void show(String message, int duration) {  
     // Java <----> JavaScript 參數對應類型:  
     //        Boolean -> Bool
     //        Integer -> Number
     //        Double -> Number
     //        Float -> Number
     //        String -> String
     //        Callback -> function
     //        ReadableMap -> Object
     //        ReadableArray -> Array  
     Toast.makeText(getReactApplicationContext(), message, duration).show();  
 }}

results matching ""

    No results matching ""