调用原生Android支付方法后Flutter应用重启而非恢复如何解决
问题根源
你当前的实现逻辑是支付完成后新启动了一个继承自FlutterActivity的BackToMerchantActivity,该Activity会初始化一个独立的新Flutter引擎实例,和你App原有运行的主Flutter引擎完全隔离,因此会触发App整体重启,原有状态全部丢失。
解决方案
废弃单独新建的BackToMerchantActivity,通过原生Android的页面结果回调能力,在原有主FlutterActivity中接收支付结果再通过MethodChannel回传给Flutter端即可,具体实现步骤如下:
- 在原有主FlutterActivity中注册支付结果回调,直接通过绑定原有Flutter引擎的MethodChannel发送结果
class MainActivity : FlutterActivity() { private val CHANNEL = "my.com.ipay88.ipay88payment/backToMarchant" // 注册支付页面结果回调 private val payResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == Activity.RESULT_OK) { val data = result.data ?: return@registerForActivityResult val resultTitle = data.getStringExtra("resultTitle") ?: "" val resultInfo = data.getStringExtra("resultInfo") ?: "" val resultExtra = data.getStringExtra("resultExtra") ?: "" // 直接用当前主Activity绑定的Flutter引擎发送消息,不会重启App MethodChannel(flutterEngine?.dartExecutor?.binaryMessenger, CHANNEL).invokeMethod( "receivePayResult", mapOf( "resultTitle" to resultTitle, "resultInfo" to resultInfo, "resultExtra" to resultExtra ) ) } } // 原有调起支付的逻辑替换为用launcher启动支付页 fun startPay() { val payIntent = Intent(this, 你的支付页Activity::class.java) payResultLauncher.launch(payIntent) } }
- 修改支付完成后的返回逻辑,不要新启动
BackToMerchantActivity,直接设置结果关闭支付页即可
Intent returnIntent = new Intent(); returnIntent.putExtra("resultTitle",resultPaymentMessage.getStrResultTitle()); returnIntent.putExtra("resultInfo",resultPaymentMessage.getStrResultInfo()); returnIntent.putExtra("resultExtra",resultPaymentMessage.getStrResultExtra()); setResult(Activity.RESULT_OK, returnIntent); // 直接关闭支付页,返回到之前的主FlutterActivity finish();
- Flutter端保持原有MethodChannel监听逻辑即可,注意通道名和方法名要和原生侧一致。
额外注意事项
- 如果使用Flutter 3.0以上版本,优先用
flutterEngine.dartExecutor.binaryMessenger初始化MethodChannel,比旧版的flutterView兼容性更强 - 不要在任何非主FlutterActivity中重复调用
GeneratedPluginRegistrant.registerWith,避免重复初始化引擎
内容的提问来源于stack exchange,提问作者pendi
相关产品推荐
相关产品推荐

