科技引领我们前行

【前言】

1:先简单的介绍下Flutter,它是一款跨平台应用SDK,高性能跨平台实现方案(暂时讨论iOS和Android),

它不同于RN,少了像RN的JS中间桥接层,所以它的性能相比RN有了很好的提升。

2:Flutter从谷歌推出以来,我就开始关注,到现在3.0以上的版本,SDK也逐步稳定,目前我们的网约车项目也开始集成Flutter组件,并且效果不错。

3:Flutter弊端也是很明显,目前支持移动端的第三方框架可选性还不多。

对于iOS和Android来说,使用Flutter开发一套完整的APP,还是需要了解两端的开发知识,所以使用Flutter,还得并行学习提高跨平台技能。

4:对于Flutter跨平台实现方案,目前我整理了2套可行方案:

(1):全部使用Flutter框架,包括核心功能部分,缺点未知风险可能比较多,不做优先选择。

(2):核心功能使用原生,其他功能使用原生与Flutter交互,优点是风险最小并可控,也是最好选择方案。当然对于跨平台开发者的跨平台技能要求较高。

【跨平台选择】

1:我们项目中目前使用原生与Flutter交互,实现的跨平台方案,所以本文主要介绍‘原生与Flutter’集成和交互功能(暂时讨论iOS和Android)。

2:之前公司有过一次Flutter的技术分享会,相关资料和项目实践资料都有整理过,因为开发需求一直比较多,所以拖到今天才在博客上分享和大家一起研究。

3:Flutter环境的配置和安装本文就不讲了,最全面的教程可以去官网找。

iOS原生集成Flutter

注意:iOS原生集成Flutter方案已经又更新,所以原来的操作已经行不通了,下面的是新版方案。

使用 cocodpods 把 Flutter 模块集成到工程中,步骤如下:

(1):生成的Flutter工程(或者是git上下载的Flutter工程)放在与iOS原工程同级目录, 如下:(红色部分为flutter项目名称)

---指定目录,创建Flutter工程(生成指令:flutter create -t module flutter_module_test),放在与iOS原工程同级目录:

(2):使用cocodpods,把 Flutter 工程集成到iOS项目环境中

打开 主工程 pod PodFile 添加 flutter_application_path,配置集成 Flutter 工程,案例如下:

# Uncomment the next line to define a global platform for your project

# platform :ios, '9.0'
           use_frameworks!

flutter_application_path = '/Users/a/Desktop/Flutter-Test/flutter_module_test'
           load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')

target 'iOS-TestFlutter' do
           # Comment the next line if you don't want to use dynamic frameworks

# Pods for iOS-TestFlutter

pod 'SnapKit'

install_all_flutter_pods(flutter_application_path)

end

注意: flutter_application_path = '/Users/a/Desktop/Flutter-Test/flutter_module_test' 文件路径一定不要搞错了!!

打开项目:,集成完成。

(3):运行报错处理

flutter集成完成运行Xcode,Xcode11.0、模拟器 iPhone11 Pro Max 13.0 系统会报错:

解决方案:切换 flutter 的channelmaster,目前是stable。参考https://github.com/flutter/flutter/issues/43151解决办法。

终端指令:flutter channel master

切换成功之后,flutter 版本由v1.9.1+hotfix.6变成了v1.12.16-pre.32。删掉 flutter 模块,重新建模块然后pod install,重新编译成功。

(4):完成上面步骤,通过终端 pod install 指令,flutter项目集成到iOS原生项目中的就完成了。

这里不过先要编译下flutter项目,编译通过后,iOS项目再执行下 pod install 就可以运行了,集成完成。

每次fluter项目中代码有改动(我使用的VSCode开发fluter),iOS只要通过终端 pod install 指令,就能同步fluter的最新代码到Xcode中。

【iOS 跳转指定 Flutter 页面和交互】

---实现方案:通过创建 FlutterViewController,通知channel发送信号实现:

(1):iOS 跳转指定 Flutter 页面实现(swift代码演示)

let flutterViewController = FlutterViewController(project: nil, nibName: nil, bundle: nil)  // 创建 FlutterViewController

flutterViewController?.setInitialRoute("page_home")                             //  home参数: 用于区分跳转页面

let channelName = "com.page_home/native_post"                     // 信号通道名称:与flutter中注册的一致

// FlutterEventChannel:创建事件通道对象

let evenChannal = FlutterEventChannel(name: channelName, binaryMessenger: flutterViewController!)

evenChannal.setStreamHandler(self)                                         // 回调代理,flutter主动交互iOS时使用

flutterMainVC?.present(flutterViewController!, animated: true, completion: nil) // 开始跳转,flutterMainVC 必须是最后一层VC

(2):flutter判断来自iOS的跳转目标实现(Dart代码演示)

void main(){  //flutter主入口

                  run(ui.window.defaultRouteName);
               }
               Future<String> run(String name) async{
               switch (name) {
                 case "page_home":
                   runApp(appRouter(title: "跳转page_home",)); //创建对应Widget
                   break;
                 case "page_wallet":
                   runApp(appRouter(title: "跳转page_wallet",));//创建对应Widget
                   break;
                 case "page_setting":
                   runApp(appRouter(title: "跳转page_setting",));//创建对应Widget
                   break;
                 default:
                   runApp(MyApp());
                   break;
                 }
                  return '';
               }

(3):flutter主动交互iOS(Dart代码演示)

class HomePage extends StatefulWidget {

_HomePageState createState() => _HomePageState();

}

class _HomePageState extends State<HomePage> {

static const EventChannel eventChannel = const EventChannel('com.pages.your/native_post');  //注册一个信号通道

                   void _incrementCounter() {     // 点击事件的交互
                         eventChannel.receiveBroadcastStream(12345).listen(_onEvent, onError: _onError); // 发送参数12345,同时监听通知回调
                     });

void _onEvent(Object event) {  // iOS 交互回调,返回值FlutterError为nill,执行此方法。FlutterError是什么数据,情况下面。

//  iOS 交互成功

}

void _onError(Object error) {    // iOS 交互回调,返回值FlutterError有值,执行此方法

//  iOS 交互失败

}

}

(4):iOS 接送处理来自flutter的交互(swift代码演示)

注:iOS 接送处理来自flutter的交互,主要通过FlutterStreamHandler代理方法

extension ViewController: FlutterStreamHandler {

// arguments:是 flutter给native的参数  EventSink:是用来传数据的载体  FlutterError:返回给flutter的报错信息

func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? {

events("push传值给flutter的vc");

return nil;

}

// arguments:是 flutter给native的参数  FlutterError:返回给flutter的报错信息。

// 注: 此代理方法主要用来提前处理交互定义内容,无相关的内容提前判断,进行过滤处理。

func onCancel(withArguments arguments: Any?) -> FlutterError? {

print(arguments as Any)

return nil;

}

}

【iOS and Flutter结语

       

人生就像美丽的花朵

      1:谷歌推出Flutter时间大概一年左右,版本也一直在更新推进,所以与原生的集成和交互也一直在更新,这就需要我们时刻保持学习状态,动态更新技能。

       2:iOS 和 Flutter的交互方式,并非就上面我分享的一种,也有其他的方,相比而言,我的方案还是比较简洁和实用。

       3:作为一个移动端专业开发者,我们应该保持对新技术的热情,跨平台方案离我们已经不再遥远,相信未来会普及和更加完善。

       4:如果技术上有不同看法或者新的技术,欢迎联系一起讨论,本人QQ: 497609288。

Flutter跨平台框架的使用-iOS最新版的更多相关文章

  1. 浅谈跨平台框架 Flutter 的优势与结构

    作者:个推iOS工程师 伊泽瑞尔 一.背景 目前,移动开发技术主要分为原生开发和跨平台开发两种.其中,原生应用是指在某个特定的移动平台上,使用平台所支持的开发工具和语言,直接调用系统提供的API所开发 ...

  2. 一文读懂跨平台框架 Flutter 的搭建与运行

    作者:个推iOS开发工程师 伊泽瑞尔 Flutter是Google推出的跨平台的解决方案,用以帮助开发者在 Android 和 iOS 两个平台开发高质量原生应用的全新移动 UI 框架. 之前我们为大 ...

  3. 跨平台框架与React Native基础

    跨平台框架 什么是跨平台框架? 这里的多个平台一般是指 iOS 和 Android . 为什么需要跨平台框架? 目前,移动开发技术主要分为原生开发和跨平台开发两种.其中,原生应用是指在某个特定的移动平 ...

  4. uni-app跨平台框架介绍和快速入门

    前言: 首先今天主要介绍的是一个多平台的前端框架uni-app,关于多平台的前端框架网上有很多成熟的解决方案比如说Taro,React Native,Flutter等这些都是一些非常优秀的前端跨平台的 ...

  5. iOS 最新版 CocoaPods 的安装流程

    iOS 最新版 CocoaPods 的安装流程1.移除现有Ruby默认源$gem sources --remove https://rubygems.org/2.使用新的源$gem sources - ...

  6. JavaScript开源跨平台框架NativeScript

    NativeScript是一款使用JavaScript语言来构建跨平台原生移动应用的开源框架,支持iOS.Android和Windows Phone.且NativeScript的使用没有过多繁杂的要求 ...

  7. Flutter 与 Swift - 在创建 iOS 应用程序时应该押注什么技术?

    Swift 和 Flutter 是考虑创建 iOS 应用程序的公司最想要的两种技术.开发者能用原生技术取胜吗?如何选择,哪种更适合您的应用?让我们一探究竟吧! 根据 Statista 的数据, 201 ...

  8. 即将开源 | 2亿用户背后的Flutter应用框架Fish Redux

    背景 在闲鱼深度使用 Flutter 开发过程中,我们遇到了业务代码耦合严重,代码可维护性糟糕,如入泥泞.对于闲鱼这样的负责业务场景,我们需要一个统一的应用框架来摆脱当下的开发困境,而这也是 Flut ...

  9. .NET 跨平台框架Avalonia UI: 填坑指北(二):在Linux上跑起来了

    上一章回顾:  .NET 跨平台框架Avalonia UI: 填坑指北(一):熟悉UI操作 本篇将要阐述 包括但不仅限于Avalonia及所有Windows到Linux跨平台开发 的一些注意事项: 一 ...

随机推荐

  1. Java分层架构的使用规则

    原文章引用地址:http://blog.csdn.net/ygzk123/article/details/7816511 三层结构的程序不是说把项目分成DAL, BLL, WebUI三个模块就叫三层了 ...

  2. 如何使用 babel

    babel-cli 在项目内运行 babel-cli 配置.babelrc 配置.jshintrc Babel 用于将 ES6 的代码转化为 ES5,使得 ES6 可以在目前的浏览器环境下使用.学习使 ...

  3. 吴裕雄--天生自然python学习笔记:python 用 Open CV通过人脸识别进行登录

    人脸识别登录功能的基本原理是通过对比两张图片的差异度来判断两张图片是 否是同 一人的面部 . 对比图片 差异度 的算法有很多种,本例中使用“颜色直方图” 算法来实现对人脸图像的识别. 下面为比较 im ...

  4. Tomcat爆出严重漏洞,附影响版本及解决方案

    昨天,群里聊嗨了.大家都在远程办公,却都急急忙忙的升级线上的 Tomcat 版本,原因就是 Tomcat 被曝出了严重的漏洞,几乎涉及到所有的版本. 一.漏洞原理具体来说就是 Apache Tomca ...

  5. OneDrive for Business

    一.界面介绍 1.在Office 365主页 点击“OneDrive”登陆 2.进入OneDrive,可对文档进行存储.同步并共享文档. 3.点击,可对文档进行编辑.分享.重命名等操作 二.文档同步 ...

  6. sql常见面试(2)

    1.sql 删除表中重复数据保留一条 1)删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录 delete from people where   p ...

  7. jenkins-自定义工作空间目录

  8. CPU时间分片、多线程、并发和并行

    1.CPU时间分片.多线程? 如果线程数不多于CPU核心数,会把各个线程都分配一个核心,不需分片,而当线程数多于CPU核心数时才会分片. 2.并发和并行的区别 并发:当有多个线程在操作时,如果系统只有 ...

  9. Python:扫描目录下的所有文件

    扫描目录下的所有文件并返回文件的绝对路径 def fileListFunc(filePathList): fileList = [] for filePath in filePathList: for ...

  10. Mybatis 常见面试题

    1.什么是Redis?简述它的优缺点? Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到 ...