概述
使用Flutter从零开始开发App是一件轻松惬意的事情,但对于一些成熟的产品来说,完全摒弃原有App的历史沉淀,全面转向Flutter是有难度的。
因此使用Flutter去统一Android、iOS技术栈,把它作为已有原生App的扩展能力,通过有序推进来提升移动终端的开发效率。
目前Flutter开发形式一般是两种:
1、统一办理形式:适用于创立Flutter工程来办理多端(ios、android、web、desktop,等)
2、三端分离形式:适用于在本来的项目中引证flutter模块,让flutter模块编译后产品集成在原生(ios、android、web、desktop等)项目中。
本篇主要研究三端分离形式下的iOS项目集成Flutter页面 Flutter UI组件可以作为嵌入式框架增量添加到现有的iOS应用程序中。有下面主流2种方法可以在现有应用程序中嵌入Flutter。
1.为Flutter引擎、编译的Dart代码和所有Flutter插件创建框架。在这里,您手动嵌入框架,并在Xcode中更新现有应用程序的构建设置。
优点:集成使用时比较简单,集成方本地不需要安装Flutter SDK。
缺点:更新时需要手动替换SDK 比较繁琐。
2.使用CocoaPods依赖管理器并安装Flutter SDK。在这种情况下,每次构建应用程序时,都会从源代码编译flatter_module。
优点:CocoaPods便于统一的第三方sdk管理,集成比较方便简单,不需要繁琐配置
缺点:使用方本地有需要安装Flutter SDK的要求。
鉴于两者互有特色,本篇都做介绍,在使用时 由读者根据具体项目场景作出取舍。
开发环境:
xCode版本(Version 14.2-14C18),iOS目标版本11.0以上
flutter版本3.3.7 dart版本2.18.4
第1种手动集成方案:
一、创建Flutter模块
1.进入Terminal命令行
2.选择flutter工程文件路径 cd user/flutter/path
3.创建模版工程文件 flutter create --template module my_flutter
注意:与新建单独运行的flutter有差异,命令行需要加上--template module,不然不能输出SDK
此时生成的flutter工程结构如下:
my_flutter/
├── .ios/
│ ├── Runner.xcworkspace
│ └── Flutter/podhelper.rb
├── lib/
│ └── main.dart
├── test/
└── pubspec.yaml
我们将Dart代码加至lib/目录即可
二、将flutter模块集成至原生工程
1.进入Terminal命令行
2.执行输出SDK动作 flutter build ios-framework --output=some/path/MyApp/Flutter/
注意:这一步可能会报错,在输出前需要跑一下真机
执行成功后输出如下目录:
some/path/MyApp/
└── Flutter/
├── Debug/
│ ├── Flutter.xcframework
│ ├── App.xcframework
│ ├── FlutterPluginRegistrant.xcframework (only if you have plugins with iOS platform code)
│ └── example_plugin.xcframework (each plugin is a separate framework)
├── Profile/
│ ├── Flutter.xcframework
│ ├── App.xcframework
│ ├── FlutterPluginRegistrant.xcframework
│ └── example_plugin.xcframework
└── Release/
├── Flutter.xcframework
├── App.xcframework
├── FlutterPluginRegistrant.xcframework
└── example_plugin.xcframework
3.将Debug文件夹和Release文件夹拷贝至iOS原生工程目录下
4.打开原生工程目录,将sdk加入到Link Binary With Libraries,Build Settings > Build Phases > Link Binary With Libraries,
在目标设置里,将Release文件夹放置进去
第2种CocoaPods集成方案:
脚本:
# Uncomment the next line to define a global platform for your project
# platform :ios, '16.0'
## Flutter 模块的路径
flutter_application_path = './my_flutter'
load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')
target 'sw_flutter' do
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
install_all_flutter_pods(flutter_application_path)
end
post_install do |installer|
flutter_post_install(installer) **if** **defined?** (flutter_post_install)
end
打开命令行执行
pod install
成功后在工程文件的pod栏出现下图,证明导入成功