Flutter:如何从原生Activity获取数据到Flutter Widget?
实现原生Activity表单数据回传Flutter的方案
一、Android端代码修改
1. 改用带结果返回的Activity启动方式
你当前用startActivity无法接收返回数据,需要替换为Activity Result API(替代已废弃的startActivityForResult),同时保留MethodChannel的回调逻辑:
private lateinit var formActivityLauncher: ActivityResultLauncher<Intent> private var pendingResult: MethodChannel.Result? = null // 确保和Flutter端的Channel名称一致 private val CHANNEL = "form_activity_channel" override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 初始化ActivityResultLauncher,处理返回结果 formActivityLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == Activity.RESULT_OK) { val data = result.data // 提取表单数据 val firstName = data?.getStringExtra("first_name") ?: "" val lastName = data?.getStringExtra("last_name") ?: "" // 把数据打包成Map回传Flutter val resultMap = mapOf( "firstName" to firstName, "lastName" to lastName ) pendingResult?.success(resultMap) } else { // 处理用户取消的情况 pendingResult?.error("CANCELLED", "用户取消表单填写", null) } pendingResult = null } } override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result -> if (call.method == "launchActivity") { pendingResult = result val intent = Intent(this, FormActivity::class.java) formActivityLauncher.launch(intent) } else { result.notImplemented() } } }
2. 修改FormActivity的完成按钮逻辑
在FormActivity中,点击完成按钮时将表单数据打包返回:
// 假设完成按钮的点击事件处理 btnFinish.setOnClickListener { val firstName = etFirstName.text.toString().trim() val lastName = etLastName.text.toString().trim() val resultIntent = Intent() resultIntent.putExtra("first_name", firstName) resultIntent.putExtra("last_name", lastName) // 设置返回结果并关闭Activity setResult(Activity.RESULT_OK, resultIntent) finish() }
二、Flutter端代码实现
1. 初始化MethodChannel并接收返回数据
在Flutter的Widget中,通过MethodChannel调用原生方法,并更新UI展示数据:
import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; class FormDataReceiver extends StatefulWidget { const FormDataReceiver({super.key}); @override State<FormDataReceiver> createState() => _FormDataReceiverState(); } class _FormDataReceiverState extends State<FormDataReceiver> { // 和Android端的Channel名称保持一致 static const platform = MethodChannel('form_activity_channel'); String _firstName = ''; String _lastName = ''; Future<void> _openNativeForm() async { try { // 调用原生方法并等待返回结果 final Map<String, dynamic> result = await platform.invokeMethod('launchActivity'); setState(() { _firstName = result['firstName'] ?? ''; _lastName = result['lastName'] ?? ''; }); } on PlatformException catch (e) { // 捕获错误,比如用户取消操作 debugPrint("操作异常:${e.message}"); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('接收原生表单数据')), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ ElevatedButton( onPressed: _openNativeForm, child: const Text('打开原生表单'), ), const SizedBox(height: 24), Text('名字:$_firstName', style: const TextStyle(fontSize: 16)), Text('姓氏:$_lastName', style: const TextStyle(fontSize: 16)), ], ), ), ); } }
关键注意事项
- 两端的Channel名称必须完全一致,否则无法建立通信。
- 处理空值情况:Android端用
?:给空数据设默认值,Flutter端用??做兜底。 - 如果需要验证表单输入合法性,可以在FormActivity的完成按钮点击时先判断输入是否为空,再返回结果。
内容的提问来源于stack exchange,提问作者Ayoub BOUMZEBRA
相关产品推荐
相关产品推荐

