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

Android Activity的onBackPressed触发时向Flutter回传数据的实现问题

从Android Activity的onBackPressed回传数据到Flutter

Flutter端代码

保持原有异步调用逻辑即可,await newScreen.invokeMethod('openScreen')会等待Android端返回结果:

class _HomePage extends State<StatefulWidget> {
  var data = "";
  static const newScreen = MethodChannel("newScreenPlatform");

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Native Window"),
      ),
      body: Center(
        child: ElevatedButton(
            onPressed: () async {
              try {
                data = await newScreen.invokeMethod('openScreen');
                debugPrint("Data $data");
              } on PlatformException catch (e) {
                debugPrint("Error ${e.message}");
              }
            },
            child: const Text("Open Native Activity")),
      ),
    );
  }
}

Android端代码

需要调整逻辑,保存MethodChannel的Result对象,在Activity的onBackPressed触发时回传数据:

  1. 在FlutterActivity中保存Result实例并启动目标Activity:
class MainActivity : FlutterActivity() {
    private var pendingResult: MethodChannel.Result? = null

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "newScreenPlatform")
            .setMethodCallHandler { call, result ->
                when (call.method) {
                    "openScreen" -> {
                        // 保存Result对象,用于后续回传数据
                        pendingResult = result
                        // 启动目标Android Activity
                        val intent = Intent(this, HeartBeatActivity::class.java)
                        startActivity(intent)
                    }
                    else -> {
                        result.notImplemented()
                    }
                }
            }
    }

    // 提供方法让子Activity调用,回传数据
    fun sendDataBackToFlutter(data: String) {
        pendingResult?.success(data)
        // 回传后清空Result,避免内存泄漏
        pendingResult = null
    }

    override fun onDestroy() {
        super.onDestroy()
        // 页面销毁时清空Result,防止内存泄漏
        pendingResult = null
    }
}
  1. 在目标Activity(如HeartBeatActivity)的onBackPressed中触发回传:
class HeartBeatActivity : AppCompatActivity() {
    override fun onBackPressed() {
        // 执行你的业务逻辑
        dispose()
        shareData()
        
        // 调用FlutterActivity的方法回传数据
        val mainActivity = parent as? MainActivity
        mainActivity?.sendDataBackToFlutter("Bpm reading 82")
        
        super.onBackPressed()
    }

    // 自定义业务方法
    private fun dispose() {
        // 实现你的资源释放逻辑
    }

    private fun shareData() {
        // 实现你的数据处理逻辑
    }
}

核心说明

  • 保存MethodChannel.Result是关键:打开Activity是异步操作,不能在openScreen方法中直接返回结果,需等待用户触发返回键时再调用result.success()。
  • 注意内存泄漏:回传数据后和FlutterActivity销毁时,要及时清空pendingResult对象。
  • 替代方案:也可以用Activity Result API接收目标Activity的返回数据,再通过MethodChannel传给Flutter,适合独立启动的Activity场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 01:45:12