React Native裸工作流:自定义模块如何实现ActivityEventListener?
解决React Native自定义模块无法接收Activity返回结果的问题
1. 修复MainActivity中ReactInstanceManager的初始化问题
你当前的MainActivity仅声明了mReactInstanceManager但未初始化,直接调用onActivityResult会触发空指针异常。由于继承了DevMenuAwareActivity,可以通过父类提供的方法直接获取实例,无需手动声明变量:
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // 通过父类方法获取实例,避免空指针 getReactInstanceManager().onActivityResult(this, requestCode, resultCode, data); }
如果DevMenuAwareActivity未提供getReactInstanceManager()方法,可通过ReactActivityDelegate获取:
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); getDelegate().getReactInstanceManager().onActivityResult(this, requestCode, resultCode, data); }
2. 修正PaymentModule中的核心问题
(1)补全ReactMethod的Promise参数
你的openExampleApp方法未将Promise作为参数传入,导致this.promise = promise是无效赋值,后续无法正常回调结果:
@ReactMethod public void openExampleApp(String amount, String messageType, String currencyCode, String currencyFraction, String currencyAlpha, String transactionId, Promise promise) { try { Log.d("PaymentModule", "Trigger openPaxPayment Fn: "+amount); this.promise = promise; // 正确赋值传入的Promise Intent paymentIntent = new Intent("com.my.example.REQUEST"); // 填充Intent参数 paymentIntent.putExtra("MESSAGE_TYPE", messageType); paymentIntent.putExtra("AMOUNT", amount); paymentIntent.putExtra("CURRENCY_CODE", currencyCode); paymentIntent.putExtra("CURRENCY_FRACTION", currencyFraction); paymentIntent.putExtra("CURRENCY_ALPHA", currencyAlpha); paymentIntent.putExtra("MERCHANT_TRS_ID", transactionId); // 移除多余的dataBundle参数,startActivityForResult无需传入已在Intent中的extras getReactApplicationContext().startActivityForResult(paymentIntent, 8888, null); } catch (Exception e) { Log.d("PaymentModule Err", String.valueOf(e)); promise.reject("ERROR", e.getMessage()); // 异常时必须reject Promise,避免RN端挂起 e.printStackTrace(); } }
(2)完善onActivityResult的逻辑处理
需要判断请求码和结果码,避免错误回调,同时处理data为空的边界情况:
@Override public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) { // 仅处理我们发起的请求 if (requestCode == 8888 && this.promise != null) { if (resultCode == Activity.RESULT_OK && data != null) { this.promise.resolve(data.getDataString()); } else if (resultCode == Activity.RESULT_CANCELED) { this.promise.reject("CANCELED", "用户取消了操作"); } else { this.promise.reject("FAILED", "操作失败,结果码:" + resultCode); } // 重置promise,避免重复调用导致异常 this.promise = null; } }
(3)移除多余的Bundle参数
调用startActivityForResult时,第三个参数是用于设置额外启动选项(如动画、窗口模式),而非传递Intent的extras。你的Intent已经通过putExtra添加了参数,直接传null即可。
3. 确保模块正确注册
确认你的PaymentModule已在自定义Package中注册:
public class PaymentPackage implements ReactPackage { @Override public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) { List<NativeModule> modules = new ArrayList<>(); modules.add(new PaymentModule(reactContext)); return modules; } @Override public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) { return Collections.emptyList(); } }
然后在MainApplication的getPackages()方法中添加该Package。
内容的提问来源于stack exchange,提问作者Franz Pichardo Rodriguez
相关产品推荐
相关产品推荐

