【问题标题】:How to pass data from Java Activity to react native?如何从 Java Activity 传递数据以响应本机?
【发布时间】:2020-06-12 07:25:39
【问题描述】:

我无法从 java 活动中传递数据以做出本机反应。 我正在处理信用卡付款,付款完成后,响应存储在一个名为 message 的变量中。我需要将此消息传递给我的 react 本机代码。

//Java模块,我要传递的数据在“消息”中

公共类 HelloWorldModule 扩展 ReactContextBaseJavaModule 实现 ActivityEventListener{ 活动活动;

ReactApplicationContext 反应上下文; 公共 HelloWorldModule(ReactApplicationContext reactContext,Activity 活动) { 超级(反应上下文); //React Native 需要 this.reactContext=reactContext; this.activity=活动; reactContext.addActivityEventListener(this); //将本机模块注册为Activity结果监听器

}

@Override
public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
    // ReactApplicationContext reactContext = this.getReactNativeHost().getReactInstanceManager().getCurrentReactApplicationContext();
    // reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit();
    // reactContext
    // .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
    // .emit('message', message);

/*
 *  We advise you to do a further verification of transaction's details on your server to be
 *  sure everything checks out before providing service or goods.
*/
if (requestCode == RaveConstants.RAVE_REQUEST_CODE && data != null) {
    String message = data.getStringExtra("response");
    // Log.e("RAVE",message);
    if (resultCode == RavePayActivity.RESULT_SUCCESS) {
        Toast.makeText(activity, "SUCCESS " + message, Toast.LENGTH_SHORT).show();
    }
    else if (resultCode == RavePayActivity.RESULT_ERROR) {
        Toast.makeText(activity, "ERROR " + message, Toast.LENGTH_SHORT).show();
    }
    else if (resultCode == RavePayActivity.RESULT_CANCELLED) {
        Toast.makeText(activity, "CANCELLED " + message, Toast.LENGTH_SHORT).show();
    }
}
// else {
//      super.onActivityResult(activity, requestCode, resultCode, data);
// }

}

// @Override // public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) { // Toast.makeText(activity, "hello", Toast.LENGTH_SHORT).show(); // }

@Override

public void onNewIntent(Intent intent) {

}

@Override
//getName is required to define the name of the module represented in JavaScript
public String getName() { 
    return "HelloWorld";
}

@ReactMethod
public void sayHi(Callback errorCallback, Callback successCallback) {
    try{
        int amount = 30;//call.argument("amount");
                    String narration = "Payment for soup";//call.argument("nara");
                    String countryCode = "NG"; //call.argument("countryCode");
                    String currency =  "NGN"; //call.argument("currency");
                    String amountText = "50";//call.argument("amountText");
                    String email = "*****@yahoo.com";//call.argument("email");
                    String name = "Ubanna Danny";//call.argument("name");
                    String paymentId = "a98sjkhdjdu";//call.argument("paymentId");



                    String key ="FLWPUBK-****-X";
                     String encryptionKey = "****";

                            new RavePayManager(activity).setAmount(Double.parseDouble(String.valueOf(amount)))
                            .setCountry(countryCode)
                            .setCurrency(currency)
                            .setEmail(email)
                            .setfName(name)
                            .setlName("")
                            .setNarration(narration)
                            .setPublicKey(key)
                            .setEncryptionKey(encryptionKey)
                            .setTxRef(paymentId)
                            .acceptMpesaPayments(false)
                            .acceptAccountPayments(true)
                            .acceptCardPayments(true)
                            .acceptGHMobileMoneyPayments(false)
                            .onStagingEnv(false)
                            .allowSaveCardFeature(true)
                            .initialize();
    } catch (IllegalViewOperationException e) {
        errorCallback.invoke(e.getMessage());
    }                  
}

}

// 反应原生代码

   // async function to call the Java native method
    async sayHiFromJava() {
      HelloWorld.sayHi( (err) => {console.log(err)}, (msg) => {console.log(msg)} );
    }

请帮忙。

【问题讨论】:

    标签: java android reactjs react-native react-native-bridge


    【解决方案1】:

    使用设备发射器从本机发送数据以响应本机

    在活动结果中添加以下代码

    ReactContext context = this.getReactNativeHost().getReactInstanceManager().getCurrentReactContext();
    
    context.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit();
    context
      .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
      .emit('message', message);
    

    在 react native 中添加 Dives 发射器监听器

    import {DeviceEventEmitter} from 'react-native';
    
    EmitterModule.addListener('message', (message) => {
      console.log(message);
    };
    

    【讨论】:

    • 请澄清我应该把代码放在哪一行,当我构建时出现此错误 - 错误:未闭合字符文字 .emit('message', message);
    • 我需要包含这个吗 - WritableMap params = Arguments.createMap(); params.putString("eventProperty", "someValue");
    • 如果你在使用上述代码时遇到错误,我已经编辑了我的代码
    • @Override public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) { ReactApplicationContext reactContext = this.getReactNativeHost().getReactInstanceManager().getCurrentReactApplicationContext(); reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit(); reactContext .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) .emit('message', message);
    • please im error this error -- error: unclosed character literal .emit('message', message);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    相关资源
    最近更新 更多