由于国内 Flutter 开发 Desktop 的资料特别少,在开发过程中,遇到了各种问题,特此记录。
需求来源于为了更好的控制窗体内的布局区域,需要将应用窗体设置为固定尺寸。
为设置应用窗体尺寸找到 Flutter-Desktop-Embedding 项目,这个项目是google 自己搞的一些非正式插件仓库,并没有发布到pub仓库中,所以没有办法直接 pub get 了,里面东西不多,正好有我需要的跨平台 window_size 插件,二话不说,安装先。
仓库地址:https://gitee.com/mirrors/Flutter-Desktop-Embedding.git
一、配置 pubspec.yml 依赖关系:
dependencies:
flutter:
...
#插件名称
window_size:
git:
url: https://gitee.com/mirrors/Flutter-Desktop-Embedding.git
#插件地址
path: plugins/window_size
#你需要加载的 git commit hash 值,这里我用当前最后一次提交的hash code
ref: 66e4b05
二、更新依赖
flutter pub get
三、构建 macos app
flutter build macos
在构建过程中,出现了以下几个问题:
1、错误:Podsfile missing
解决: 通过对 flutter_tools 的跟踪,发现flutter 官方的一个Bug,导致 Podfile 永远不会被创建,插件也无法被pod加载,在尝试了手动处理失败后,终于下定决心更改源码来解决。
首先,安装cocoapods :https://www.jianshu.com/p/f43b5964f582
然后打开文件:
# [flutterFramework] 替换本地框架路径
[flutterFramework]/packages/flutter_tools/lib/src/project.dart
找到 237 行左右函数 ensureReadyForPlatformSpecificTooling:
Future<void> ensureReadyForPlatformSpecificTooling({bool checkProjects = false})
将函数体中原有逻辑:
if (!directory.existsSync() || hasExampleApp) {
return;
}
替换为:
if (!directory.existsSync() || hasExampleApp) {
await refreshPluginsList(this);
await injectPlugins(this, checkProjects: checkProjects);
return;
}
即可解决。
2、错误:diff: /Podfile.lock: No such file or directory | diff: /Manifest.lock: No such file or directory
解决:
通过在macos 目录中搜索,我发现这两个文件是存在的,为什么还是提示没有找到,通过分析,发现是路径问题,而这个路径在pods编译配置中是通过环境变量来设置的,通过在不同配置文件中进行配置测试,最终发现只有 macos/Runner/Configs 下的配置文件不会每次重新生成。
于是在 macos/Runner/Configs/AppInfo.xcconfig 文件中定义环境变量:
PODS_PODFILE_DIR_PATH=[project_dir]/macos/
PODS_ROOT=[project_dir]/macos/Pods/
问题解决。