1. 程式人生 > >react-native 新增 Toast 模組

react-native 新增 Toast 模組

1.建立一個原生模組開始。一個原生模組是一個通常繼承 ReactContextBaseJavaModule 類的 Java 類,並且實現了 JavaScript 需要實現的方法

public class AliToastAndroid extends ReactContextBaseJavaModule {

    private static final String DURATION_SHORT_KEY = "SHORT";
    private static final String DURATION_LONG_KEY = "LONG";

    public AliToastAndroid(ReactApplicationContext reactContext) {
        super(reactContext);
    }

    @Override
    public String getName() {
        return "AliToastAndroid";
    }

    @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;
    }

    @ReactMethod
    public void show(String message, int duration) {
        Toast.makeText(getReactApplicationContext(), message, duration).show();
    }
}

注意:

1.ReactContextBaseJavaModule 需要一個叫做 getName 的方法被實現。這個方法的目的就是返回在 JavaScript 裡面表示這個類的叫做 NativeModule 的字串的名字。在這裡我們呼叫 AliToastAndroid 因此我們可以在 JavaScript 裡面使用 React.NativeModules.AliToastAndroid來得到它。

2.一個可選的叫做 getConstants 的方法會將傳遞給 JavaScript 的常量返回。這個方法的實現並不是必須的,但是卻對在 JavaScript 和 Java 中同步的預定義的關鍵字的值非常重要。

3.給 JavaScript 暴露一個方法,一個 Java 方法需要使用 @ReactMethod 來註解。橋接的方法的返回值型別總是void。React Native 的橋接是非同步的,因此將一個結果傳遞給 JavaScript 的唯一方式就是使用回撥函式或者呼叫事件


2.註冊模組:

public class AnExampleReactPackage extends MainReactPackage {
    @Override
    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
        List<NativeModule> modules = super.createNativeModules(reactContext);

        //new an Array intstead of abstract List exception
        List<NativeModule> result = new ArrayList<>();
        result.addAll(modules);

        result.add(new AliToastAndroid(reactContext));
        return result;
    }
}

 mReactInstanceManager = ReactInstanceManager.builder()
                .setApplication(getApplication())
                .setBundleAssetName("index.android.bundle")
                .setJSMainModuleName("index.android")
                .addPackage(new AnExampleReactPackage())
                .setUseDeveloperSupport(BuildConfig.DEBUG)
                .setInitialLifecycleState(LifecycleState.RESUMED)
                .build();

3.在你的 JavaScript 檔案裡面你可以像下面這樣呼叫方法:

var AliToastAndroid = React.NativeModules.AliToastAndroid
    AliToastAndroid.show('444444', AliToastAndroid.LONG);