由于国内 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/

问题解决。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐