Flutter应用如何与同设备其他应用实现双向数据传输?
嘿,这个问题我刚好在项目里实践过,跨应用双向通信在Flutter中得结合Android和iOS各自的系统能力来实现,毕竟Flutter本身是基于原生层的框架,底层得依赖平台API来完成跨应用的数据交互。下面分场景给你一步步拆解:
一、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

