Flutter 实战
一.前置概念
1. Flutter module
概念:
将Flutter添加到你的既有 iOS 应用中(利用CocoaPods)
创建 :
1 | cd some/path/ |
2. 原生插件 (Plugin packages)
概念:
使用 Dart 编写的,按需使用 Java 或 Kotlin、Objective-C 或 Swift 分别在 Android 和/或 iOS 平台实现的 package。
创建 :
1 | // 使用 -a 选项指定 Android 的语言,或使用 -i 选项指定 iOS 的语言 |
3. 纯 Dart 库 (Dart packages)
概念:
用 Dart 编写的传统 package,比如 path。其中一些可能包含 Flutter 的特定功能,因此依赖于 Flutter 框架,其使用范围仅限于 Flutter,比如 fluro。
创建:
1 | flutter create --template=package flutter_packages |
Tips:
你的应用将不能在模拟器上运行 Release 模式,因为 Flutter 还不支持将 Dart 代码编译成 x86/x86_64 ahead-of-time (AOT) 模式的二进制文件。
Flutter.framework
是 Flutter engine 的框架,App.framework
是你的 Dart 代码的编译产物。
二. 开始集成
修改Podfile
在
Podfile
中添加下面代码:1
2flutter_application_path = '${flutter module目录}'
load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')每个需要集成 Flutter 的 Podfile target,执行
install_all_flutter_pods(flutter_application_path)
:1
2
3target 'MyApp' do
install_all_flutter_pods(flutter_application_path)
end运行
pod install
。
Tips:
- podhelper.rb 脚本会把你的 plugins, Flutter.framework,和 App.framework 集成到你的项目中
- 运行一个集成flutter module的项目:
1 | cd ${flutter module目录} |
三. Flutter Engine
1 | lazy var flutterEngine = FlutterEngine(name: "flutter engine") |
Tips:
1. IDE推荐Android Studio
2.在 FlutterEngine
上调用 run
,默认将会调用你的 lib/main.dart
文件里的 main()
函数。
四. Flutter和iOS原生交互
1. Methods Channel
dart To iOS
1 | // 测试 methodChannel dart -> iOS |
1 | // iOS 端 |
iOS To dart
1 | // iOS 端 |
1 | // dart 端 |
2.平台视图托管 (PlatformView)
集成平台视图(后称为平台视图)允许将原生视图嵌入到 Flutter 应用中,所以您可以通过 Dart 将变换、裁剪和不透明度等效果应用到原生视图。(eg: Map,Webview … )
1 | // Dart 端 |
1 | // iOS 端 |
3.Event Channel
1 | // swift |
1 | // Dart |
Tips:
五. 包体积增长和性能测试
在 iOS 平台上,跟据 App Store Connect 的数据,同一应用的发布 IPA 在 iPhone X 上的下载文件体积为 10.9 MB。 IPA 比 APK 大,主要是因为 Apple 加密了 IPA 中的二进制文件,使得压缩效率降低。(可以查看 iOS App Store Specific Considerations 中 QA1795 关于加密的部分)
Tips:
六. 适用业务场景
几乎95%以上业务都能使用Flutter开发,即使flutter无法实现也能利用platformView进行原生视图托管实现。
七. 相关资料
翻译(二手)资料: