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

Flutter应用如何与同设备其他应用实现双向数据传输?

嘿,这个问题我刚好在项目里实践过,跨应用双向通信在Flutter中得结合Android和iOS各自的系统能力来实现,毕竟Flutter本身是基于原生层的框架,底层得依赖平台API来完成跨应用的数据交互。下面分场景给你一步步拆解:

Flutter 与其他应用的双向数据传输方案

一、Flutter 向其他应用发送数据

不管对方是原生应用还是另一个Flutter应用,核心思路都是调用平台的「应用间通信API」,Flutter可以通过Platform Channel直接调用原生代码,或者用成熟的插件简化操作。

1. Android 平台实现

Android里主要用Intent来传递数据,你可以在Flutter里通过Platform Channel调用原生的Intent发送逻辑:

原生Android代码(Kotlin)

class MainActivity : FlutterActivity() {
    private val CHANNEL = "com.example.app/communication"

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
            if (call.method == "sendDataToOtherApp") {
                val data = call.argument<String>("data") ?: ""
                val intent = Intent().apply {
                    action = Intent.ACTION_SEND
                    type = "text/plain"
                    putExtra(Intent.EXTRA_TEXT, data)
                    // 如果知道目标应用的包名,可以指定包名避免选择器
                    // setPackage("com.target.app")
                }
                startActivity(Intent.createChooser(intent, "分享数据到"))
                result.success(true)
            } else {
                result.notImplemented()
            }
        }
    }
}

Flutter 侧调用代码

import 'package:flutter/services.dart';

class CommunicationService {
  static const platform = MethodChannel('com.example.app/communication');

  static Future<void> sendData(String data) async {
    try {
      await platform.invokeMethod('sendDataToOtherApp', {'data': data});
    } on PlatformException catch (e) {
      print("发送失败: ${e.message}");
    }
  }
}

// 使用时调用
CommunicationService.sendData("从Flutter发来的测试数据");

2. iOS 平台实现

iOS里用UIApplication.shared.openURL或者UIDocumentInteractionController,同样通过Platform Channel调用:

原生iOS代码(Swift)

import UIKit
import Flutter

class MainActivity: FlutterViewController {
    private let CHANNEL = "com.example.app/communication"

    override func viewDidLoad() {
        super.viewDidLoad()
        let messenger = flutterEngine?.binaryMessenger
        let channel = FlutterMethodChannel(name: CHANNEL, binaryMessenger: messenger!)
        channel.setMethodCallHandler { [weak self] call, result in
            if call.method == "sendDataToOtherApp" {
                guard let data = call.arguments as? [String: String],
                      let content = data["data"] else {
                    result.error("INVALID_ARGUMENT", "数据格式错误", nil)
                    return
                }
                // 用URL Scheme打开目标应用并传递数据
                if let url = URL(string: "targetapp://receive?data=\(content.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!)") {
                    if UIApplication.shared.canOpenURL(url) {
                        UIApplication.shared.open(url)
                        result.success(true)
                    } else {
                        result.error("APP_NOT_INSTALLED", "目标应用未安装", nil)
                    }
                }
            } else {
                result.notImplemented()
            }
        }
    }
}

Flutter 侧调用代码和Android一致,复用上面的CommunicationService即可。

二、其他应用向 Flutter 应用发送数据

这时候需要先给你的Flutter应用配置「接收数据的入口」,然后在Flutter侧监听数据。

1. 配置平台接收入口

Android 平台(AndroidManifest.xml)

在<activity>标签里添加intent-filter,用来接收指定类型的数据:

<activity
    android:name=".MainActivity"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter>
    <!-- 或者自定义URL Scheme -->
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="myflutterapp" />
    </intent-filter>
</activity>

iOS 平台(Info.plist)

添加URL Scheme配置:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>myflutterapp</string>
        </array>
    </dict>
</array>

2. Flutter 侧监听数据

可以用url_launcher插件监听URL跳转,或者通过Platform Channel获取原生传递的Intent数据:

方式1:用url_launcher监听URL Scheme

import 'package:url_launcher/url_launcher.dart';

void initState() {
    super.initState();
    // 监听应用从后台唤起时的URL
    getInitialLink().then((link) {
        if (link != null) {
            _handleReceivedData(link);
        }
    });
    // 监听实时的URL跳转
    linkStream.listen((link) {
        if (link != null) {
            _handleReceivedData(link);
        }
    });
}

void _handleReceivedData(String link) {
    // 解析URL中的参数,比如 myflutterapp://receive?data=xxx
    Uri uri = Uri.parse(link);
    String? data = uri.queryParameters['data'];
    if (data != null) {
        print("收到其他应用的数据: $data");
        // 这里处理数据逻辑
    }
}

方式2:通过Platform Channel获取Android Intent数据

原生Android代码(Kotlin):

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // 获取启动Intent中的数据
    val receivedData = intent?.getStringExtra(Intent.EXTRA_TEXT)
    if (receivedData != null) {
        // 通过Channel传递给Flutter
        MethodChannel(flutterEngine?.dartExecutor?.binaryMessenger!!, CHANNEL).invokeMethod("onDataReceived", receivedData)
    }
}

Flutter侧监听:

CommunicationService.platform.setMethodCallHandler((call) async {
    if (call.method == "onDataReceived") {
        String data = call.arguments as String;
        print("收到原生传递的数据: $data");
    }
});

三、两个Flutter应用之间的双向通信

如果是两个Flutter应用,其实可以互相配置URL Scheme,然后用上面的方式互相调用传递数据。另外,如果你是同开发者账号下的应用,还可以用更高效的方式:

  • Android:用ContentProvider或者AIDL实现进程间通信
  • iOS:用App Groups共享UserDefaults或者文件

举个简单的双向例子:App A发送数据到App B,App B处理后再发回App A。只需要两边都配置各自的URL Scheme,App A打开App B的URL传递数据,App B处理完后再打开App A的URL回传结果即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:08:54