Flutter iOS 集成使用 flutter boost

在 Flutter项目中集成完 flutter boost,并且已经使用了 flutter boost进行了路由管理,这时如果需要和iOS混合开发,这时就要到 原生端进行集成。

注意:之前建的项目必须是 Flutter module项目,并且原生项目和flutter module项目在同一个文件夹下面

下面是原生端集成 flutter boost的步骤:

  • 在原生项目的 Podfile文件中添加如下代码
# Uncomment the next line to define a global platform for your project
platform :ios, '12.0'flutter_application_path = '../my_flutter'
load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')target 'FlutterList' do# Comment the next line if you don't want to use dynamic frameworksuse_frameworks!# Pods for FlutterListinstall_all_flutter_pods(flutter_application_path)pod 'Masonry', '1.0.2'endpost_install do |installer|flutter_post_install(installer) if defined?(flutter_post_install)
end

填写完后指向 pod install。此时项目的pod目录下面就会出现 flutter相关的库
在这里插入图片描述
到此就完成 flutter混合开发的集成工作,接下来就是需要 编写使用代码

  • 编写混合开发代码
    这里没有跟着flutter boost 官网进行集成 https://github.com/alibaba/flutter_boost/blob/master/docs/install.md 创建代码,稍微进行了些改进。

  • HYFlutterBoostDelegate

  • HYFlutterViewContainer

  • HYFlutterViewController
    分别创建了以上代码,并且在AppDelegate 中使用 FlutterBoost

  • HYFlutterBoostDelegate

import Foundation
import flutter_boostclass HYFlutterBoostDelegate: NSObject, FlutterBoostDelegate {///您用来push的导航栏var navigationController:UINavigationController? {return UINavigationController.topNavigationController()?.navigationController}///用来存返回flutter侧返回结果的表var resultTable:Dictionary<String,([AnyHashable:Any]?)->Void> = [:];func pushNativeRoute(_ pageName: String!, arguments: [AnyHashable : Any]!) {//可以用参数来控制是push还是poplet isPresent = arguments["isPresent"] as? Bool ?? falselet isAnimated = arguments["isAnimated"] as? Bool ?? true//这里根据pageName来判断生成哪个vc,这里给个默认的了let targetViewController = UIViewController()// 这里也可以使用路由进行跳转if(isPresent){self.navigationController?.present(targetViewController, animated: isAnimated, completion: nil)}else{self.navigationController?.pushViewController(targetViewController, animated: isAnimated)}}func pushFlutterRoute(_ options: FlutterBoostRouteOptions!) {let vc:HYFlutterViewController = HYFlutterViewController()vc.setName(options.pageName, uniqueId: options.uniqueId, params: options.arguments,opaque: options.opaque)vc.hidesBottomBarWhenPushed = true//对这个页面设置结果resultTable[options.pageName] = options.onPageFinished;if let nav = navigationController  {nav.pushViewController(vc, animated: true)}}func popRoute(_ options: FlutterBoostRouteOptions!) {//如果当前被present的vc是container,那么就执行dismiss逻辑if let vc = self.navigationController?.presentedViewController as? HYFlutterViewController, vc.uniqueIDString() == options.uniqueId{//这里分为两种情况,由于UIModalPresentationOverFullScreen下,生命周期显示会有问题//所以需要手动调用的场景,从而使下面底部的vc调用viewAppear相关逻辑if vc.modalPresentationStyle == .overFullScreen {//这里手动beginAppearanceTransition触发页面生命周期self.navigationController?.topViewController?.beginAppearanceTransition(true, animated: false)vc.dismiss(animated: true) {self.navigationController?.topViewController?.endAppearanceTransition()}}else{//正常场景,直接dismissvc.dismiss(animated: true, completion: nil)}}else{self.navigationController?.popViewController(animated: true)}//否则直接执行pop逻辑//这里在pop的时候将参数带出,并且从结果表中移除if let onPageFinshed = resultTable[options.pageName] {onPageFinshed(options.arguments)resultTable.removeValue(forKey: options.pageName)}}}
  • HYFlutterViewContainer
#import <flutter_boost/FlutterBoost.h>NS_ASSUME_NONNULL_BEGIN@interface HYFlutterViewContainer : FBFlutterViewContainer@endNS_ASSUME_NONNULL_END
#import "HYFlutterViewContainer.h"@interface HYFlutterViewContainer (){UINavigationBar *_bar;
}@property (nonatomic)BOOL navigationBarHidden;
@property (nonatomic, strong) FBVoidCallback removeEventCallback;@end@implementation HYFlutterViewContainer- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.
}- (void)viewWillAppear:(BOOL)animated {[super viewWillAppear:animated];[self.navigationController setNavigationBarHidden:YES animated:animated];
}/// 设置这个container对应的从flutter过来的事件监听
-(void)setupEventListeningFromFlutter{__weak typeof(self) weakSelf = self;// 为这个容器注册监听,监听内部的flutterPage往这个容器发的事件self.removeEventCallback = [FlutterBoost.instance addEventListener:^(NSString *name, NSDictionary *arguments) {__strong typeof(self) strongSelf = weakSelf;//事件名NSString *event = arguments[@"event"];//事件参数NSDictionary *args = arguments[@"args"];if ([event isEqualToString:@"enablePopGesture"]) {// 多page情况下的侧滑动态禁用和启用事件NSNumber *enableNum = args[@"enable"];BOOL enable = [enableNum boolValue];//右滑控制
//            strongSelf.fd_interactivePopDisabled = !enable;}} forName:self.uniqueId];
}- (BOOL)navigationBarHidden {return YES;
}- (UINavigationBar *)navBar
{if (!_bar) {_bar = [UINavigationBar new];}return _bar;
}- (BOOL)shouldAutorotate
{return NO;
}- (UIInterfaceOrientationMask)supportedInterfaceOrientations
{return UIInterfaceOrientationMaskPortrait;
}@end
  • HYFlutterViewController
#import <UIKit/UIKit.h>
#import "HYFlutterViewContainer.h"@interface HYFlutterViewController : UIViewController@property (nonatomic, strong) HYFlutterViewContainer *container;- (NSString *)uniqueIDString;- (void)setName:(NSString *)name uniqueId:(NSString *)uniqueId params:(NSDictionary *)params opaque:(BOOL) opaque;@end
#import "HYFlutterViewController.h"
#import <Masonry/Masonry.h>
#import "UINavigationController+HY.h"@interface HYFlutterViewController ()@end@implementation HYFlutterViewController- (void)setName:(NSString *)name uniqueId:(NSString *)uniqueId params:(NSDictionary *)params opaque:(BOOL) opaque {_container = [HYFlutterViewContainer new];[_container setName:name uniqueId:uniqueId params:params opaque:opaque];
}- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.// 隐藏导航栏[self.container.navigationController setNavigationBarHidden:YES animated:YES];[self addChildViewController:_container];[_container didMoveToParentViewController:self];[self.view addSubview:_container.view];[_container.view mas_makeConstraints:^(MASConstraintMaker *make) {make.edges.mas_equalTo(UIEdgeInsetsZero);}];
}- (NSString *)uniqueIDString {return self.container.uniqueIDString;
}- (void)dealloc {[_container removeFromParentViewController];[_container didMoveToParentViewController:nil];
}@end
  • AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {HYFlutterBoostDelegate* delegate = [[HYFlutterBoostDelegate alloc]init];[FlutterBoost.instance setup:application delegate:delegate callback:^(FlutterEngine *engine) {NSLog(@"FlutterBoost 开始操作");}];self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];self.window.backgroundColor = [UIColor whiteColor];ViewController* VC = [[ViewController alloc]init];UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:VC];self.window.rootViewController = nav;[self.window makeKeyAndVisible];return YES;
}

使用 Flutter boost进行调转

- (void)btnClick:(UIButton *)btn {FlutterBoostRouteOptions* option = [[FlutterBoostRouteOptions alloc]init];option.pageName = @"/";[[[FlutterBoost instance] plugin].delegate pushFlutterRoute:option];
}

到此flutter boost原生交互使用结束,此时进到flutter界面导航是没有左侧的返回按钮的,这需要自己处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/27396.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Spring】Spring之事务底层源码解析

目的 能使用spring事务解决开发需求了解spring事务是如何被spring管理的了解spring事务底层原理实现&#xff0c;比如代理、事务传播机制等 Spring事务简单使用 配置数据源及事务管理器&#xff1a; Component ComponentScan("com.firechou.aop") EnableTransact…

bigemap如何添加高清在线地图?

说明&#xff1a;批量添加可以同时添加多个在线地图&#xff0c;一次性添加完成&#xff08;批量添加无法验证地址是否可以访问&#xff09; 添加后如下图&#xff1a; 第一步 &#xff1a; 制作地图配置文件&#xff1a;选择添加在线地图&#xff08;查看帮助&#xff09;。 …

Chatgpt AI newbing作画,文字生成图 BingImageCreator 二次开发,对接wxbot

开源项目 https://github.com/acheong08/BingImageCreator 获取cookie信息 cookieStore.get("_U").then(result > console.log(result.value)) pip3 install --upgrade BingImageCreator import os import BingImageCreatoros.environ["http_proxy"]…

基于 yolov8 的人体姿态评估

写在前面 工作中遇到&#xff0c;简单整理博文内容为使用预训练模型的一个预测 Demo测试图片来源与网络,如有侵权请告知理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#xff0c;全心全意&#xff0c;永不停…

华为认证 | 云计算HCIE3.0改版后有什么变化?

随着技术的不断进步和行业的发展&#xff0c;云计算的HCIE作为华为公司的顶级认证&#xff0c;也进行了版本的更新。 那改版后有哪些变化呢&#xff0c;今天给大家讲讲。 01 HCIE认证简介 HCIE认证是华为公司旗下的顶级专业认证&#xff0c;面向IT领域的高级专业人士。 它涵…

83 | Python可视化篇 —— Bokeh数据可视化

Bokeh 是一种交互式数据可视化库,它可以在 Python 中使用。它的设计目标是提供一个简单、灵活和强大的方式来创建现代数据可视化,同时保持良好的性能。Bokeh 支持多种图表类型,包括线图、散点图、柱状图、饼图、区域图、热力图等。此外,它还支持将这些图表组合在一起以创建…

收集到大量的名片怎么转为excel?

来百度APP畅享高清图片 参加完展会或集体会议&#xff0c;是不是收了一大堆名片&#xff0c;保管起来超级麻烦&#xff0c;还容易丢三落四&#xff1f;别急&#xff0c;我们有办法&#xff01;把名片转成电子版保存到电脑上就完美啦&#xff01;但要是名片数量有点多&#xff0…

ChatGPT应用在AIGC内容生产【赠书活动|第一期《硅基物语》】

文章目录 爆火的AI工具ChatGPT走入大众视野的AIGCAIGC领域的发展AIGC价值引领『赠书活动 &#xff5c; 第一期』 爆火的AI工具ChatGPT 2023年伊始&#xff0c;ChatGPT就火遍全网&#xff0c;成为了全球最快拥有1亿月活用户的产品。在地铁上、电梯中、咖啡厅到处都充满着讨论AI…

Glusterfs 调优

直接上干货&#xff0c;替换volume 名称&#xff0c;CPU、memory 根据实际机型来配置 gluster volume info gluster volume get user-data all |grep event -A7 net.ipv4.tcp_congestion_controlhtcp# // 打开metadata-cache,打开这个选项可以提高在mount端操作文件、目录元数…

后端开发, 接口幂等性是什么意思

在后端开发中,接口的幂等性是指同一个请求的多次执行所产生的效果与执行一次的效果相同。简而言之,对于同一个接口请求,无论发送多少次,其对资源的状态修改结果都是一致的。 幂等性在接口设计和实现中非常重要,特别是在涉及数据修改或资源状态变更的情况下。如果一个接口…

五、PC远程控制ESP32 LED灯

1. 整体思路 2. 代码 # 整体流程 # 1. 链接wifi # 2. 启动网络功能(UDP) # 3. 接收网络数据 # 4. 处理接收的数据import socket import time import network import machinedef do_connect():wlan = network.WLAN(network.STA_IF)wlan.active(True)if not wlan.isconnected(…

在 Spring Boot 应用程序中将 MapStruct 与 Lombok 结合使用的方法

在本文中&#xff0c;您将找到有关如何高效使用 MapStruct、Lombok 和 Spring Boot 的代码示例和说明。 介绍 当您实现任何规模的服务时&#xff0c;您通常需要将数据从一种结构移动到另一种结构。通常&#xff0c;这是在不同逻辑层使用的相同数据 - 在业务逻辑、数据库级别或…

perl脚本调用openssh不能正确执行(ctl_dir /root/.libnet-openssh-perl/ is not secure)的原因排查

在使用perl脚本的时候&#xff0c;通过Net::OpenSSH去获取执行节点的信息是一种常用的方法。在某个环境中&#xff0c;执行命令的时候出错&#xff0c;下面展示一下相关的代码 my $ssh_ops {user > "root", password > "password", master_opts >…

【BI系统】选型常见问题解答二

本文主要总结BI系统选型过程中遇见的常见问题&#xff0c;并针对性做出回答&#xff0c;希望能为即将选型&#xff0c;或正在选型BI系统的企业用户们提供一个快速了解通道。 有针对金蝶云星空的BI方案吗&#xff1f;能起到怎样的作用&#xff1f; 答&#xff1a;奥威BI系统拥…

20个Golang自动化DevOps库

探索 20 个用于简化任务和提高生产力的重要库。 Golang&#xff0c;也称为 Go&#xff0c;是一种静态类型、编译型编程语言&#xff0c;由 Google 的 Robert Griesemer、Rob Pike 和 Ken Thompson 设计。它于 2009 年推出&#xff0c;旨在解决其他编程语言的缺点&#xff0c;特…

Nevron Vision for .NET Crack

Nevron Vision for .NET Crack NET Vision是一个用于创建具有数据可视化功能的强大数据表示应用程序的套件。该套件具有用于.NET的Nevron Chart、用于.NET的Nevron Diagram和用于.NET的Nevron User Interface。精心设计的对象模型、众多功能和高质量的演示使复杂数据的可视化变…

【MySQL】

这里写目录标题 MySQL架构一条sql执行流程MySQL数据存放电脑位置ibd文件结构行溢出是什么MySQL行记录存储格式 MySQL架构 MySQL 的架构共分为两层&#xff1a;Server 层和存储引擎层 Server层 Server 层主要负责建立连接、分析和执行 SQL。MySQL 里大多数的核心功能模块都在这实…

后端开发2.mongdb的集成

使用docker安装 安装 拉取镜像 docker pull mongo:4.4.14-focal 创建容器 docker run -itd --name mongo -p 8036:27017 mongo:4.4.14-focal --auth 配置管理员 进入容器 docker exec -it mongo bash 进入终端 mongo 进入admin数据库 use admin 创建管理员账户 db.c…

Pytorch深度学习-----优化器详解(SGD、Adam、RMSprop)

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用&#xff08;ToTensor&#xff0c;Normalize&#xff0c;Resize &#xff0c;Co…

python机器学习(七)决策树(下) 特征工程、字典特征、文本特征、决策树算法API、可视化、解决回归问题

决策树算法 特征工程-特征提取 特征提取就是将任意数据转换为可用于机器学习的数字特征。计算机无法直接识别字符串&#xff0c;将字符串转换为机器可以读懂的数字特征&#xff0c;才能让计算机理解该字符串(特征)表达的意义。 主要分为&#xff1a;字典特征提取(特征离散化)…