如何在macOS/Windows端Flutter应用中通过系统文件管理器打开指定文件
Flutter 实现系统「打开方式」唤起应用并接收文件方案
直接读取main函数参数为空是因为移动平台原生层没有将文件路径参数透传到Flutter层,你需要分别在各端配置文件类型关联,再通过原生通道把收到的文件路径传递到Flutter侧,具体实现步骤如下:
分端配置
1. Android 端
- 首先在
android/app/src/main/AndroidManifest.xml的启动Activity标签下添加文件关联intent-filter,示例配置如下:
<intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <!-- 替换为你需要支持的文件MIME类型 --> <data android:mimeType="text/plain" /> <data android:mimeType="application/pdf" /> </intent-filter>
- 在
MainActivity中重写onCreate和onNewIntent方法,将收到的文件路径通过MethodChannel传递到Flutter层,冷启动场景可以先缓存路径,等待Flutter初始化完成后再主动读取。
2. iOS 端
- 打开
ios/Runner/Info.plist,添加CFBundleDocumentTypes字段声明支持的文件类型,示例配置如下:
<key>CFBundleDocumentTypes</key> <array> <dict> <key>CFBundleTypeIconFiles</key> <array/> <key>CFBundleTypeName</key> <string>自定义文件类型</string> <key>LSHandlerRank</key> <string>Owner</string> <key>LSItemContentTypes</key> <array> <!-- 替换为对应文件的UTI,比如pdf对应com.adobe.pdf,txt对应public.plain-text --> <string>com.adobe.pdf</string> <string>public.plain-text</string> </array> </dict> </array>
- 在
AppDelegate中重写application:openURL:options:方法,拿到文件路径后通过MethodChannel传递到Flutter层。
3. 桌面端(Windows/macOS/Linux)
桌面端可以直接读取main函数的入参,前提是提前配置好应用和对应文件类型的关联:
- Windows端需要修改打包配置,在注册表中写入文件关联信息
- macOS端和iOS逻辑类似,在
Info.plist中配置CFBundleDocumentTypes即可 - Linux端修改
.desktop文件添加MIME类型关联
Flutter 侧接收逻辑
- 应用启动时先通过
MethodChannel向原生层查询是否有缓存的待处理文件路径 - 注册
MethodChannel回调,监听应用前台运行时收到的新文件打开请求 - 拿到文件路径后直接用
dart:io的File类读取文件内容即可
简化实现方案
如果不想自行编写原生层逻辑,可以直接使用receive_sharing_intent这类封装好的插件,内部已经实现了各端的参数透传逻辑,只需按要求配置对应端的文件关联声明即可使用。
内容的提问来源于stack exchange,提问作者Benjamin Dean
相关产品推荐
相关产品推荐

