как отправить объект / строку с Android Activity onActivityResult реагировать на родной - PullRequest
0 голосов
/ 25 октября 2018

В моем проекте «native native» я реализовал платёжный sdk в Android (который не поддерживается в реагировать на нативный). Поэтому я пытался вызвать нативный sdk с нативными модулями.

Я могу звонитьSDKUI платежа от собственного встроенного модуля реагирования, но когда время результатов не может отправить результаты обратно к исходному компоненту реагирования ..

Платежный шлюз -> PAYUBIZ

, более подробную информацию можно найти ниже.код ..

в конце платежного шлюза я отобразил ответ на платеж в нативном оповещении Android ..

использованный код ..

1. Created NATIVE MODULES in react native side..



     import {NativeModules} from 'react-native';
        module.exports = NativeModules.PayUBizAccess;

        in button action following code to call native method from android
        PayUBizAccess.showPayuBiz();

2. Created ReactContextBaseJavaModule based PayUBizModule



@ReactMethod
  public void showPayuBiz() {

    final Activity activity = getCurrentActivity();


    Intent intent = new Intent(activity, PayuActivity.class);


    getReactApplicationContext().startActivity(intent);
   }

PayuActivity.class is the payment activity class

3. Display results after payment success or failure..



     @Override
            public void onActivityResult(int requestCode, int resultCode, final Intent data) {



                if (requestCode == PayuConstants.PAYU_REQUEST_CODE) {
                    if (data != null) {


                        new AlertDialog.Builder(this)
                                .setCancelable(false)
                                .setMessage("Payu's Data : " + data.getStringExtra("payu_response") + "\n\n\n Merchant's Data: " + data.getStringExtra("result"))
                                .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int whichButton) {
                                        dialog.dismiss();
                                        finish();
                                    }
                                }).show();

                    } else {
                        Toast.makeText(this, getString(R.string.could_not_receive_data), Toast.LENGTH_LONG).show();
                    }
                }
            }

4. After alert clicking button in alert it directly moves to react native component..

Так что теперь я хочу результатовданные реагируют нативно, предложите мне любые решения

заранее спасибо

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

Я бы предложил использовать обещание.
В вашем нативном модуле есть свойство как Promise mPromise; (также включает import com.facebook.react.bridge.Promise;) и примите обещание в вашем собственном методе реагирования как

@ReactMethod
public void showPayuBiz(Promise promise) {
  mPromise = promise;
  final Activity activity = getCurrentActivity();
  Intent intent = new Intent(activity, PayuActivity.class);
  getReactApplicationContext().startActivity(intent);
}

Ив вашем onActivityResult вы можете использовать его следующим образом.

@Override
public void onActivityResult(int requestCode, int resultCode, final Intent data) 
{
  if (requestCode == PayuConstants.PAYU_REQUEST_CODE) {
    //example for handling success response
    this.promise.resolve(data.getDataString()); // you can further process this data in react native component.
  }
  else{
    //example for handling error response
    this.promise.reject(data.getDataString());
  }
}

Затем вы можете использовать его следующим образом

PayUBizAccess.showPayuBiz()
    .then(data => {
      console.log(data);
      //success 
    })
    .catch(error => {
      console.log(data);
      //failure
    });

Редактировать

Если onActivityResult() находится вдругой файл.добавьте mReactInstanceManager.onActivityResult(requestCode, resultCode, data); в onActivityResult(), который находится в MainActivity.

И внутри вашего собственного модуля добавьте следующий метод.

 @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    this.mPromise.resolve(data.getDataString());
}
0 голосов
/ 25 октября 2018

Я использовал ответы @Ayush Khare .. столкнулся с несколькими проблемами при отладке .. поэтому я отправлю сюда точный ответ

1.React Native Side

Component will mount add following

    DeviceEventEmitter.addListener('PAYUEVENT', this.payuResponseGet);debugger

Add following method for trigger event

payuResponseGet = (payUData) => {
    console.log(payUData);debugger // logging twice
    // this.setState({
    //   modalVisible: args.visible
    // })
  }

2. Activity side

import com.facebook.react.ReactInstanceManager;
//import com.facebook.react.ReactApplicationContext;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.modules.core.DeviceEventManagerModule;


Add following on result method
//  mPromise.resolve(data.getDataString());
 ReactInstanceManager mReactInstanceManager = getReactNativeHost().getReactInstanceManager();
 ReactApplicationContext context = (ReactApplicationContext) mReactInstanceManager.getCurrentReactContext();

 WritableMap payuData = Arguments.createMap();
        payuData.putString("PayuResponses", data.getStringExtra("payu_response"));
        payuData.putString("Merchant's Data", data.getStringExtra("result"));

 sendEvent(context,"PAYUEVENT",payuData);

//send event method
private void sendEvent(ReactContext reactContext,
                   String eventName,
                   @Nullable WritableMap params) {
  reactContext
    .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
    //supply the result in params
    .emit(eventName, params);
}

после добавления выше, запустите и получите ответы от метода триггерного события ..

0 голосов
/ 25 октября 2018

Вы можете отправить событие из своего собственного кода следующим образом:

private void sendEvent(ReactContext reactContext,
                   String eventName,
                   @Nullable WritableMap params) {
  reactContext
    .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
    //supply the result in params
    .emit(eventName, params);
}

А в своем собственном коде реакции вы можете получить событие следующим образом:

componentWillMount: function() {
   DeviceEventEmitter.addListener('keyboardWillShow', function(e: Event) {
  // handle event.
});

}

Проверьте полные документы здесь

Другой способ сделать это дан здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...