在说flutter与原生的混合开发之前,先和初学flutter的小伙伴提个建议,建议大家刚开始的时候先在纯flutter的项目上练习flutter的相关技术,等练习的差不多了, 再练习flutter与原生的交互。主要原因是:与原生交互的时候会有很多环境的问题,比较折磨人。容易让人产生畏难情绪。
  由于国内flutter做的比较多的一般是原生做安卓的小伙伴,而且市面上的书籍作者也是做安卓出身,书中的demo也是安卓的例子,安卓这一块我就不再多说了,重点说说flutter与iOS进行交互。

集成到项目

  将flutter项目集成到原生项目中,我这边参考的是官方的推荐方式Flutter module具体步骤如下:

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

在 my_flutter 模块,目录结构和普通 Flutter 应用类似:

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

参考网址:https://flutter.cn/docs/development/add-to-app/ios/project-setup

podfile的配置

1,在 Podfile 中添加下面代码:

flutter_application_path = '../my_flutter'
load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')

2,每个需要集成 Flutter 的 Podfile target,执行 install_all_flutter_pods(flutter_application_path):

target 'MyApp' doinstall_all_flutter_pods(flutter_application_path)
end

3,执行pod install
执行完这些以后,你已经将flutter项目集成到的原生的工程里面了。
备注:my_flutter这个名字大家根据自己的需求改,另外podfile下的路径记得不要弄错了。

Xcode相关的配置

1,环境变量
打开my_flutter路径下的.iOS文件夹,然后打开runner.xcworkspace,在buildsetting里面可以看到如下设置。

User-Defined这些配置里FLUTTER_ROOT特别重要,你需要在你的原生项目中把这个根据你自己的fluttersdk路径进行配置。不然的话,联调会有问题,flutter attach不成功
2,运行脚本配置
在Xcode的runScript中还需要配置一些脚本,具体如下:

具体脚本如下:

# Type a script or drag a script file from your workspace to insert its path.
/bin/sh "$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" embed
/bin/sh "$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" thin

3,真机编译bitCode问题
直接操作如下:

配置完这些,后续运行,调试项目基本不会有太大的问题了。

交互的形式

flutter与原生进行交互主要有如下几种方式:

FlutterMethodChannel

调用方法(method invocation)一次通讯

FlutterBasicMessageChannel

传递字符串&半结构化的信息。备注:持续通讯

FlutterEventChannel

用于数据流(stream)的通讯。备注:持续通讯

由于FlutterMethodChannel在项目中使用较为频繁,我下面重点说下FlutterMethodChannel,其他两个大家感兴趣的话,搜下即可,比较简单。
1,AppDelegate准备
需要配置引擎,同时是让flutter和原生app的生命周期建立绑定关系

通过AppDelegate通过集成FlutterAppDelegate来讲原生app的生命周期和flutter模块建立了绑定关系,flutterEngine需要初始化一下,同时需要将插件注册到引擎里。

2,原生调用flutter方法
原生调用flutter方法之前需要先创建一个flutterVC,具体如下:


红框下面的代码是处理flutter调用原生方法对应的处理代码。
调用flutter方法代码如下:

 /// 选择画笔颜色func selectPencilColor() -> () {selectColorType = 1let cssString = self.pencilBrush.style.lineColor.cssString()methodChannel!.invokeMethod("currentColor", arguments:cssString)present(flutterVC!, animated: true, completion: nil)}

Flutter端接收到原生的消息该如何处理呢。


3,flutter调用原生方法
flutter调用原生方法比较简单,具体如下:

    methodChannel.invokeListMethod("pickColor",currentColor);

通过上面的步骤我们基本完成了原生向flutter,flutter向原生的通信。感兴趣的小伙伴也可以对这个通信进一步的封装,阿里也封装了相关的框架,FlutterBoost感兴趣的小伙伴可以看下。

参考博客:https://www.freesion.com/article/7932966090/

混合开发的一些建议

尽可能以模块的形式进行交互,页面级,view级的交互,根据团队的规模,以及人力情况酌情考虑。还有就是flutterVC,以及flutter引擎,如果没有必要,尽量避免反复创建,影响性能。当然了如果flutter模块使用频次较低,并且重要程度没那么高,也可以用的时候再去创建。
我这边创建了一个QQ交流群,欢迎有志于进行flutter学习的小伙伴进群交流学习。

Flutter与原生混合开发相关推荐

  1. android调用flutter aar_Flutter原生混合开发

    混合开发简介 使用Flutter从零开始开发App是一件轻松惬意的事情,但对于一些成熟的产品来说,完全摒弃原有App的历史沉淀,全面转向Flutter是不现实的.因此使用Flutter去统一Andro ...

  2. uni-app结合原生混合开发

    uni-app混合开发 uni-app混合开发主要为扩展接入一些第三方的SDK或其他uni-app无法实现的功能,项目结构有两种: 主体采用uni-app,部分功能的实现使用原生开发. 主体采用原生, ...

  3. flutter打包的app有多大_Flutter原生混合开发

    使用 Flutter 从头开始写一个 App是一件轻松惬意的事情.但是对于成熟产品来说,完全摒弃原有 App 的历史沉淀,全面转向 Flutter 并不现实.用 Flutter 去统一 iOS/And ...

  4. swift项目嵌入flutter的module混合开发(官方推荐模式)

    上一篇有讲到项目混合开发配置问题. 上一篇是跟网上的各大网游搜罗的混合过程中的问题.这篇根据官方的介绍做了尝试配置比较简单.这里可以分享一下使用: 首先也是一样,在我们的项目MyApp的根目录同级文件 ...

  5. Flutter 深入探索混合开发的技术演进

    关于 Flutter 混合 PlatformView 的实现已经介绍过两次,随着 5 月份谷歌 IO 的接近,新的 PlatformView 实现应该也会随之而来,本次就从头到尾来一个详细的关于 Pl ...

  6. swift项目嵌入flutter的module混合开发(framework模式:适合多人协作开发,一个负责混合开发)

    和之前一样,这个模块也是对于本地我们开发好的代码,需要到一起开发iOS的同事需要拉代码,调试的时候.这种静态包的方式就会好很多.不用在他的电脑上也搭建flutter环境,以及创建flutter项目的拉 ...

  7. Flutter嵌入swift混合开发

    前奏: 目前基于flutter的活跃程度,有很多的开发人员开始学习flutter,我也是其中的一枚小卒.由于本公司项目涉及一些小游戏的开发,两端或者是三端(包括web)开发起来可能比较耗费人力物力,并 ...

  8. 【前端】关于h5原生混合开发,安卓返回键及侧滑返回 popstate的处理。

    文章目录 背景 跳转方式: 全部使用方式一:push 全部使用方式二:replace 期待方式 结论 错误1 错误2 错误3 错误3.1 其它 最后来个小工具 vue-router push的实现 w ...

  9. 实现Taro 项目拆分到多个分包(Taro和原生混合开发)

    实现Taro 项目拆分到多个分包 前提: 本文适合有Taro和小程序混合开发经验的人阅读(ps不然会一脸懵逼

  10. Flutter和原生App混合开发

    可以查看官方文档 https://github.com/flutter/flutter/wiki/Add-Flutter-to-existing-apps 混合开发有两种集成方式 Flutter源码集 ...

最新文章

  1. java 时间格式化_彻底解决Spring mvc中时间的转换和序列化等问题
  2. 基于倒谱法和线性预测法估计基音频率(MATLAB和Python)
  3. 最大似然估计和最大后验概率
  4. GDCM:gdcm::FilenameGenerator的测试程序
  5. 阻尼衰减曲线用python_高阻尼隔震橡胶支座结构及防震效果
  6. 每个线程只对一个数据操作就不会出现线程安全问题-------------成员变量,用来计算累加的和...
  7. pytorch实现人脸识别_PyTorch实现,GitHub4000星:这是微软开源的计算机视觉库
  8. Python+pandas填充缺失值的几种方法
  9. Codeforces 1169A Circle Metro
  10. 使用Jorm简单的增删查改数据库
  11. vue项目使用大华摄像头怎样初始化_海康、大华摄像头chrome高版本实时播放(java集成)...
  12. JAVA和JVM运行原理揭秘
  13. SSM框架原理以及流程
  14. 升级opengl和显卡驱动_opengl驱动 OpenGL版本或显卡驱动版本太低的解决方法介绍_网络-游戏圈...
  15. java集合终极总结
  16. linux mount error(79): Can not access a needed shared library
  17. 转]udev实现原理(含检测U盘拔插例子)检测热插拨 (hotplug)
  18. 【入门级】学习卡尔曼滤波
  19. 《极简算法史》读书札记
  20. 牛客SQL22--- 统计各个部门的工资记录数

热门文章

  1. 【数据结构--二叉树】--附超详细图解
  2. django models 数据库 update_or_create 更新或者插入
  3. shell—(色彩处理)
  4. 中文和英语中主语、谓语、宾语、定语、状语、补语的定义
  5. youtube的使用体会
  6. win10下git报fatal: open /dev/null or dup failed解决办法(附null.sys文件下载)
  7. 数学在线绘图计算机,Desmos Graphing Calculator插件,在线可视化图形计算器
  8. 深度学习的可解释性!
  9. [js]身份证号码验证
  10. vue项目结构文件介绍及项目运行流程