Flutter踩坑日记:解除依赖
Flutter已经融入工程有一段时间了,由于团队人数较少,所以一直没有管和原有工程解依赖的问题,今天有时间正好把这个问题给搞了。
一、分析
首先,直接忽略上一篇《接入现有iOS项目》的所有步骤,直接创建flutter_module工程
flutter create flutter_module
注:
flutter create flutter_module和flutter create -t module my_flutter区别在于带module参数,创建出来的工程会把辅助用的android,ios工程给隐藏掉,我们这里要涉及打包以及修改配置,就不需要带module参数了
其次,弄明白一件事官方wiki,里面用的两个脚本podhelper.rb和xcode_backend.sh分别在Podfile和Build Phases里面
flutter_application_path = '../my_flutter/'
eval(File.read(File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')), binding)
"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" build
"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" embed
这两个脚本的作用时什么呢?
1.podhelper.rb
这个脚本主要做了三件事:
- 通过Pod引入
Flutter.framework(Flutter引擎),以及Flutter的插件注册表FlutterPluginRegistrant(创建的工程中GeneratedPluginRegistrant.{h,m}文件中) - 引入
.flutter-plugins的依赖 - 导入
Generated.xcconfig配置,这里面放的是Flutter要用的环境变量(如:xcode_backend.sh开头就要用的$FLUTTER_ROOT)
这里面最重要的就是Flutter.framework
2.xcode_backend.sh
这个脚本原本是放在Build Phases,在Debug和Release模式下分别会产出对应环境的Flutter产物(Flutter有Debug,Profile,Release三个模式)。并且里面还有一句代码是:
RunCommand cp -r -- "${app_framework}" "${derived_dir}"
我们现在把flutter模块独立了,于是在Debug的时候执行flutter run或者打包执行flutter build ios都会在ios/Flutter文件夹下产生一些文件,其中App.framework和flutter_assets是我们最关心的。
也就是说xcode_backend.sh的作用是:
在Debug和Release下构建出对应的Flutter产物,App.framework,flutter_assets(App.framework就是我们在lib下面写的Dart代码,flutter_assets就是我们资源)
把上面的产物拷贝到App包里
那么我们也得出了相应的结论,要解除依赖,就是需要把关键的三个文件拆出来就可以了:
Flutter.frameworkApp.frameworkflutter_assets
当然如果有FlutterPlugin则还需要FlutterPluginRegistrant,这个我们后面讲。
二、创建产物工程flutter_product
把Flutter.framework、App.framework、flutter_assets三个文件拷贝到这个工程。
注:一定要对应好
Xcode和Flutter的模式,如果Xcode是Debug,那么需要Debug模式的Flutter产物,即:flutter run出来的App.framework和flutter_assets,Xcode是Release则需要flutter build ios出来的App.framework和flutter_assets。这个后续可以写个shell脚本来搞定。
编写**podspec**文件:
Pod::Spec.new do |s|
s.name = "FlutterModule"
s.version = "0.0.1"
s.summary = "A short description of FlutterModule."
s.description = "FlutterModule"
s.homepage = "http://EXAMPLE/FlutterModule"
s.license = "MIT"
s.author = { "goingta" => "tanglei@doctorwork.com" }
s.source = { :git => "", :tag => "#{s.version}" }
#s.source_files = 'Classes','Classes/**/*.{h,m}'
s.vendored_frameworks = ['Module/App.framework','Module/Flutter.framework']
s.resource = ['Module/flutter_assets']
end
三、通过Pod引入Xcode工程
修改工程下的Podfile:
pod "FlutterModule", :path => "../flutter_product"
注:我这里直接用的本地路径引入的(主要还是懒),团队开发应该是放在自己的私有pod库上。
至此,依赖就解决了,Native同学不需要关心Flutter模块,也不需要搭建Flutter环境,就可以开发了。而负责Flutter模块的同学也可以通过独立的工程单独开发,当然在大型团队开发过程中还有很多事情要做,这里只是第一步,后续把Plugin项目完成后出一篇完整文章。
Flutter踩坑日记:解除依赖的更多相关文章
- Flutter踩坑日记:接入现有iOS项目
之前搞的Flutter版工具链已经弄完了,感兴趣的朋友可以围观下,Android版本dio库(v2.0.14)发送网络请求老是报错,去官方提了issue还没回,于是今天搞一下把Flutter模块接入到 ...
- Flutter踩坑日记:Tab导航栏保持子页面状态
最近应邀票圈小伙伴躺坑Flutter,项目初步雏形完结.以原来的工具链版本为基础做了Flutter版本,不过后面还是需要优化下项目接入Redux,以及扩展一些Native方法. 这里记录一下在开发过程 ...
- Hexo搭建静态博客踩坑日记(一)
前言 博客折腾一次就好, 找一个适合自己的博客平台, 专注于内容进行提升. 方式一: 自己买服务器, 域名, 写前端, 后端(前后分离最折腾, 不分离还好一点)... 方式二: 利用Hexo, Hug ...
- AI相关 TensorFlow -卷积神经网络 踩坑日记之一
上次写完粗浅的BP算法 介绍 本来应该继续把 卷积神经网络算法写一下的 但是最近一直在踩 TensorFlow的坑.所以就先跳过算法介绍直接来应用场景,原谅我吧. TensorFlow 介绍 TF是g ...
- 人工智能(AI)库TensorFlow 踩坑日记之一
上次写完粗浅的BP算法 介绍 本来应该继续把 卷积神经网络算法写一下的 但是最近一直在踩 TensorFlow的坑.所以就先跳过算法介绍直接来应用场景,原谅我吧. TensorFlow 介绍 TF是g ...
- hexo博客谷歌百度收录踩坑日记
title: hexo博客谷歌百度收录踩坑日记 toc: false date: 2018-04-17 00:09:38 百度收录文件验证 无论怎么把渲染关掉或者render_skip都说我的格式错误 ...
- Hexo搭建静态博客踩坑日记(二)
前言 Hexo搭建静态博客踩坑日记(一), 我们说到利用Hexo快速搭建静态博客. 这节我们就来说一下主题的问题与主题的基本修改操作. 起步 chrome github hexo git node.j ...
- flutter 踩坑总结
导入第三方库踩坑小结: (编译器:VsCode) ( 打算在学习中,使用flutter重新自己的项目,遇到比较特殊的坑,就先记录一下,持续更新中) 1.把第三方库 写入pubspec.yaml文件中 ...
- JavaScript 新手的踩坑日记
引语 在1995年5月,Eich 大神在10天内就写出了第一个脚本语言的版本,JavaScript 的第一个代号是 Mocha,Marc Andreesen 起的这个名字.由于商标问题以及很多产品已经 ...
随机推荐
- 基于WebGL的三维的物联网平台技术
参加工作三年了,从一个搞调试的民工进阶为程序员,收获还是有那么一点的.慢慢讲一些. 去年在网上发现了https://hightopo.com/cn-index.html图扑软件的基于WebGL的三维j ...
- java实现把两张图片合并(Graphics2D)
package com.yin.text; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.i ...
- libtool 创建库的工具
libtool 创建库的工具 1. 背景 在不同的系统中建立动态链接库的方法有很大的差别,这主要是因为每个系统对动态链接库的用法和实现并不相同,以及编译器对动态链接库支持的选项也不太一样. 对于开发人 ...
- SRM469
250pt 在一个10^9 * 10^9大的剧院里,有最多47个位子有人,然后有一对couple想找一对左右相邻的位子,问有多少种选择方式. 思路: 总共有 n * (m-1)种方案,然后扣掉有人位置 ...
- TVS二极管
TVS管命名规则: TVS管的型号由三部分组成:系列名+电压值+单/双向符号 系列名代表不同的峰值脉冲功率和封装形式 ① SMAJ.SMBJ.SMCJ.SMDJ表示贴片封装:分别代表的峰值脉冲 ...
- [javascript-debug-ajax-json]两种不同的json格式数据
Bug 1: 1. 这里面的 data 只是一维数组{"state":0,"errorCode":0,"data":{"origi ...
- artificial neural network in spark MLLib
神经网络模型 每个node包含两种操作:线性变换(仿射变换)和激发函数(activation function). 其中仿射变换是通用的,而激发函数可以很多种,如下图. MLLib中实现ANN 使用两 ...
- Django(框架、模板)
day65 参考:https://www.cnblogs.com/liwenzhou/p/8296964.html Django框架的设计模式借鉴了MVC框架的思想,也是分成三部分,来降低各个部分之间 ...
- requests请求例子
实例一: class GetSalerInfo(View): def post(self, request): userid = request.POST/GET.get('userid',None) ...
- Linux 学习错误点整理之网络配置
本人是一名实习生,最近在学习Linux,在实操的过程中还是遇到了一些问题,所以想记录下来,供自己以后复习,也希望能给跟我一样的菜鸟的人带来一点点帮助. 我用的是VMware Workstation P ...