Flutter应用中嵌入二进制文件的推荐方式及访问方法
Flutter嵌入二进制文件的推荐实践
一、官方推荐:通过Assets资源目录嵌入(跨平台通用)
这是覆盖iOS、Android、桌面全平台的稳妥方案:
- 在项目根目录创建
assets/bin文件夹,将二进制文件放入其中
- 在项目根目录创建
- 修改
pubspec.yaml,声明该资源:
flutter: assets: - assets/bin/your_binary_file- 修改
- 代码中先将assets里的二进制文件复制到可读写的临时目录,再执行或使用:
import 'dart:io'; import 'package:flutter/services.dart'; import 'package:path_provider/path_provider.dart'; Future<String> getBinaryPath() async { final tempDir = await getTemporaryDirectory(); final targetPath = '${tempDir.path}/your_binary_file'; final binaryFile = File(targetPath); if (!await binaryFile.exists()) { // 从assets读取二进制数据 final assetBytes = await rootBundle.load('assets/bin/your_binary_file'); // 写入临时文件 await binaryFile.writeAsBytes(assetBytes.buffer.asUint8List()); // 类Unix系统(Android/macOS/Linux)需添加可执行权限 if (!Platform.isWindows) { await Process.run('chmod', ['+x', targetPath]); } } return targetPath; }
二、桌面平台专属方案
如果仅适配Windows/macOS/Linux,可直接将二进制文件放到对应平台的资源目录:
- Windows:放在
windows/assets目录,构建后会打包到应用的data/flutter_assets路径下 - macOS:放在
macos/Runner/Resources目录,打包后位于应用包的Contents/Resources下 - Linux:放在
linux/assets目录,构建后随应用打包
代码中获取路径示例:
import 'dart:io'; import 'package:path_provider/path_provider.dart'; Future<String> getDesktopBinaryPath() async { final appDir = await getApplicationSupportDirectory(); return '${appDir.path}/your_binary_file'; }
注:不同桌面平台的资源路径有细微差异,可通过
Platform.isXXX做分支判断。
为什么你之前的方法失效?
Platform.script.toFilePath()指向的是Dart VM的脚本路径,在Flutter打包后:
- 移动端(iOS/Android)的资源是打包到APK/IPA的压缩包内,没有直接的文件系统路径
- 桌面平台打包后,脚本路径也不是资源文件的实际存放路径,导致拼接的地址无效
内容的提问来源于stack exchange,提问作者surus
相关产品推荐
相关产品推荐

