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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 21:01:36