You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用原生Android支付方法后Flutter应用重启而非恢复如何解决

问题根源

你当前的实现逻辑是支付完成后新启动了一个继承自FlutterActivity的BackToMerchantActivity,该Activity会初始化一个独立的新Flutter引擎实例,和你App原有运行的主Flutter引擎完全隔离,因此会触发App整体重启,原有状态全部丢失。

解决方案

废弃单独新建的BackToMerchantActivity,通过原生Android的页面结果回调能力,在原有主FlutterActivity中接收支付结果再通过MethodChannel回传给Flutter端即可,具体实现步骤如下:

  1. 在原有主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)
    }
}
  1. 修改支付完成后的返回逻辑,不要新启动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();
  1. Flutter端保持原有MethodChannel监听逻辑即可,注意通道名和方法名要和原生侧一致。

额外注意事项

  • 如果使用Flutter 3.0以上版本,优先用flutterEngine.dartExecutor.binaryMessenger初始化MethodChannel,比旧版的flutterView兼容性更强
  • 不要在任何非主FlutterActivity中重复调用GeneratedPluginRegistrant.registerWith,避免重复初始化引擎

内容的提问来源于stack exchange,提问作者pendi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 14:15:05