Flutter混合开发(Add Flutter to existing app)

原文:Adding Flutter to iOS

一、创建一个Flutter模块

cd some/path/
flutter create --template module my_flutter

上述命令让我们在some/path/my_flutter/目录下创建了一个Flutter模块工程,在这个目录下,我们可以向在其他Flutter独立工程一样执行一些flutter命令,如:flutter run --debug或flutter build ios。你也可以在Android Studio/IntelliJ或VS代码中使用Flutter和Dart插件运行这个模块工程。此项目包含一个模块的单视图示例版本,它是一个被嵌入到现有的app之前的版本,这有助于你的代码中的纯Flutter部分的增量测试。

二、模块项目结构

my_flutter模块目录结构和普通的Flutter应用程序类似:

my_flutter/
├── .ios/
│   ├── Runner.xcworkspace
│   └── Flutter/podhelper.rb
├── lib/
│   └── main.dart
├── test/
└── pubspec.yaml

将Dart代码添加到lib/目录中。

将Flutter dependencies添加到my_flutter/pubspec。包括Flutter packages 和 plugins。

.ios隐藏文件夹包含一个Xcode workspace,在那里你可以独立运行你的模块工程 。它是一个用于引导Flutter代码的包装器项目,并包含帮助脚本,以方便构建框架或使用CocoaPods将模块工程嵌入到现有的应用程序中。

注意:将自定义的iOS代码添加到您现有的应用程序项目或插件中,而不是添加到模块的.iOS /目录中。在模块的.iOS /目录中所做的更改不会出现在使用该模块的现有iOS项目中,而是会被Flutter覆盖。
不要对.ios/目录进行源代码控制,因为它是自动生成的。在新机器上构建模块之前,在使用flutter模块构建iOS项目之前,先在my_flutter目录下运行flutter pub get来重新生成. iOS /目录。

三、将Flutter模块嵌入到现有App的中

有两种方法可以将Flutter嵌入到现有的App中。

  • 1.app的CocoaPods和本地Flutter SDK。(推荐)。
  • 2.全本地管理:将Flutter engine、编译的Dart代码、Flutter plugins打包生成frameworks,然后手动嵌入frameworks,并在Xcode中更新构建设置。

使用Flutter会增加包体积

1、使用CocoaPods+本地Flutter SDK

每个开发人员都有一个本地安装的Flutter SDK版本。简单地在Xcode中构建你的应用程序就能自动运行脚本嵌入你的Dart和插件代码。这种方案能然你只用Xcode就能快速迭代最新的Flutter模块。

下面的示例假设您的现有应用程序和Flutter模块位于同级目录中。如果您有一个不同的目录结构,您可能需要调整相对路径。

some/path/
├── my_flutter/
│   └── .ios/
│       └── Flutter/
│         └── podhelper.rb
└── MyApp/
    └── Podfile
    1. 给Podfile添加代码
flutter_application_path = '../my_flutter'
load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')
    1. 给每一个用到Flutter的target添加 install_all_flutter_pods(flutter_application_path)
target 'MyApp' do
  install_all_flutter_pods(flutter_application_path)
end
    1. pod install
      当你改变my_flutter/pubspec.yaml文件里面Flutter插件依赖关系时,需要在你的Flutter模块工程目录下执行flutter pub get刷新由podhelper.rb脚本读取的插件列表。然后在原工程目录some/path/MyApp上再pod install。

podhelper.rb脚本:把你的plugins、Flutter.framework、App.framework嵌入项目
build configurations:分别嵌入Debug/Release/Profile模式下的Flutter

2、使用frameworks+手动嵌入

生成frameworks,并通过手动编辑现有的Xcode项目的方式将它们嵌入到App中。

使用场景:您的团队成员不能在本地安装Flutter SDK和CocoaPods,或者不想使用CocoaPods管理。
缺点:在flutter模块中,每做一次代码更改你都必须运行一次flutter build ios-framework。

1.生成frameworks

下面的例子假设你想生成frameworks到some/path/MyApp/Flutter/目录。

flutter build ios-framework --output=some/path/MyApp/Flutter/
some/path/MyApp/
└── Flutter/
    ├── Debug/
    │   ├── Flutter.framework
    │   ├── App.framework
    │   ├── FlutterPluginRegistrant.framework (only if you have plugins with iOS platform code)
    │   └── example_plugin.framework (each plugin is a separate framework)
    ├── Profile/
    │   ├── Flutter.framework
    │   ├── App.framework
    │   ├── FlutterPluginRegistrant.framework
    │   └── example_plugin.framework
    └── Release/
        ├── Flutter.framework
        ├── App.framework
        ├── FlutterPluginRegistrant.framework
        └── example_plugin.framework

注意:import的Flutter.framework 和 App.framework路径要保持一致,否则会导致runtime crashes(例如Profile/Flutter.framework 和 Debug/App.framework)

Tip:Xcode 11后,可以通过添加标志--xcframework --no-universal来生成XCFrameworks而不是通用框架。

2.将生成的frameworks嵌入并链接到Xcode中

链接frameworks

  • 1.拖拽some/path/MyApp/Flutter/Release/ 下的frameworks到targets’ build settings > Build Phases > Link Binary With Libraries.
  • 2.在target’s build settings的Framework Search Paths添加$(PROJECT_DIR)/Flutter/Release/

嵌入frameworks

  • 拖拽framework到targets’ build settings > Build Phases > Embed Frameworks,选择Embed & Sign
    动态库必须嵌入app以便在runtime时加载。Plugins可以生成静态或动态框架。静态框架应该链接,而不是嵌入。如果你嵌入一个静态框架到你的应用程序,你的app将不能发布到App Store,并报一个archive error:Found an unexpected Mach-O header code。

Tip:为了适配不同模式,需要更改:
1.在MyApp.xcodeproj/project.pbxproj里面把path = Flutter/Release/example.framework;改为path = "Flutter/$(CONFIGURATION)/example.framework";

2.在Framework Search Paths添加$(PROJECT_DIR)/Flutter/$(CONFIGURATION)

还可以综合方案1、2。用CocoaPods管理Flutter,手动嵌入frameworks。

总结:混合项目 有两种方式:使用CocoaPods+本地Flutter SDK、使用frameworks+手动嵌入。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349