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触发时回传数据:
- 在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 } }
- 在目标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
相关产品推荐
相关产品推荐

