FlutterBoost 實現Flutter頁面內嵌iOS view

在使用Flutter混合開發中會遇到一些原生比Flutter優秀的控件,不想使用Flutter的控件,想在Flutter中使用原生控件。這時就會用到 Flutter頁面中內嵌 原生view,這里簡單介紹一個 內嵌 iOS 的view。

注:這里使用了 FlutterBoost。網上大部分都是代碼執行不起來,本案例起碼可以正常使用。

  • 原生部分
    這里開始在原生部分進行處理
  • 自定義 view FlutterIosTextLabel
#import <Foundation/Foundation.h>
#import <Flutter/Flutter.h>NS_ASSUME_NONNULL_BEGIN@interface FlutterIosTextLabel : NSObject<FlutterPlatformView>@property (nonatomic, strong) UILabel *label;- (instancetype)initWithFrame:(CGRect)frameviewIdentifier:(int64_t)viewIdarguments:(id _Nullable)argsbinaryMessenger:(NSObject<FlutterBinaryMessenger>*)messenger;@endNS_ASSUME_NONNULL_END
#import "FlutterIosTextLabel.h"@implementation FlutterIosTextLabel//在這里只是創建了一個UILabel
- (instancetype)initWithFrame:(CGRect)frame viewIdentifier:(int64_t)viewId arguments:(id _Nullable)args binaryMessenger:(NSObject<FlutterBinaryMessenger>*)messenger {if (self = [super init]) {self.label = [UILabel new];self.label.backgroundColor = [UIColor yellowColor];self.label.textColor = [UIColor redColor];self.label.textAlignment = NSTextAlignmentCenter;self.label.numberOfLines = 0;NSDictionary *dict = (NSDictionary *)args;NSString *textValue = dict[@"content"];self.label.text = [NSString stringWithFormat:@"我是iOSView \n在顯示:%@", textValue];}return self;
}- (nonnull UIView *)view {return self.label;
}@end
  • 創建 FlutterIosTextLabelFactory
#import <Foundation/Foundation.h>
#import <Flutter/Flutter.h>NS_ASSUME_NONNULL_BEGIN@interface FlutterIosTextLabelFactory : NSObject<FlutterPlatformViewFactory>- (instancetype)initWithMessenger:(NSObject<FlutterBinaryMessenger>*)messenger;@endNS_ASSUME_NONNULL_END
#import "FlutterIosTextLabelFactory.h"
#import "FlutterIosTextLabel.h"@implementation FlutterIosTextLabelFactory
{NSObject<FlutterBinaryMessenger> *_messenger;
}- (instancetype)initWithMessenger:(NSObject<FlutterBinaryMessenger>*)messenger {self = [super init];if (self) {_messenger = messenger;}return self;
}- (NSObject<FlutterPlatformView>*)createWithFrame:(CGRect)frame viewIdentifier:(int64_t)viewId arguments:(id _Nullable)args {return [[FlutterIosTextLabel alloc] initWithFrame:frame viewIdentifier:viewId arguments:args binaryMessenger:_messenger];
}-(NSObject<FlutterMessageCodec> *)createArgsCodec{return [FlutterStandardMessageCodec sharedInstance];
}
  • 創建 FlutterIosTextLabelPlugin
#import <Foundation/Foundation.h>
#import <Flutter/Flutter.h>NS_ASSUME_NONNULL_BEGIN@interface FlutterIosTextLabelPlugin : NSObject<FlutterPlugin>
+ (void)registerWithRegistrar:(nonnull NSObject<FlutterPluginRegistrar> *)registrar;
@endNS_ASSUME_NONNULL_END
#import "FlutterIosTextLabelPlugin.h"
#import "FlutterIosTextLabelFactory.h"@implementation FlutterIosTextLabelPlugin+ (void)registerWithRegistrar:(nonnull NSObject<FlutterPluginRegistrar> *)registrar {//注冊插件//注冊 FlutterIosTextLabelFactory//custom_platform_view 為flutter 調用此  textLabel 的標識[registrar registerViewFactory:[[FlutterIosTextLabelFactory alloc] initWithMessenger:registrar.messenger] withId:@"custom_platform_view"];
}
@end

到此原生已經集成完成一半,重點是接下來部分。

在 AppDelegate 中集成使用
修改AppDelegate.h:修改繼承為FlutterAppDelegate,并刪除window屬性,因為FlutterAppDelegate中已經自帶window屬性

#import <UIKit/UIKit.h>
#import <Flutter/Flutter.h>@interface AppDelegate : FlutterAppDelegate
@end

AppDelegate.m中引入相關頭文件

#import "FlutterIosTextLabel.h"
#import "GeneratedPluginRegistrant.h"
#import "FlutterIosTextLabelPlugin.h"

在AppDelegate.m中注冊插件,在引入 flutter_boost的情況下,需要等 flutter_boost初始化完成后,用FlutterEngine對插件進行初始化。

@interface AppDelegate ()@end@implementation AppDelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {HYFlutterBoostDelegate* delegate = [[HYFlutterBoostDelegate alloc]init];self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];self.window.backgroundColor = [UIColor whiteColor];HYTabBarController *tab = [[HYTabBarController alloc]init];self.window.rootViewController = tab;[self.window makeKeyAndVisible];[FlutterBoost.instance setup:application delegate:delegate callback:^(FlutterEngine *engine) {NSLog(@"FlutterBoost 開始操作");// 使用 MethodChannel[HYFlutterNavChannel start];[HYFlutterCommonChannel start];// 初始化Flutter內嵌iOSView插件
//        NSObject<FlutterPluginRegistrar> *registrar = [engine registrarForPlugin:@"custom_platform_view_plugin"];
//        FlutterIosTextLabelFactory *factory = [[FlutterIosTextLabelFactory alloc] initWithMessenger:registrar.messenger];
//        [registrar registerViewFactory:factory withId:@"custom_platform_view"];// 升級處理NSObject<FlutterPluginRegistrar> *registrar = [engine registrarForPlugin:@"custom_platform_view_plugin"];[FlutterIosTextLabelPlugin registerWithRegistrar:registrar];}];return YES;
}@end

到此原生集成完畢,接下來在 Flutter中進行集成

  • Flutter 部分
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';class CMNativePage extends StatelessWidget {const CMNativePage({Key? key}) : super(key: key);Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text("詳情"),),body: const Center(child: IOSCompositionWidget(),),);}
}class IOSCompositionWidget extends StatelessWidget {const IOSCompositionWidget({super.key});Widget build(BuildContext context) {// This is used in the platform side to register the view.const String viewType = 'custom_platform_view';// Pass parameters to the platform side.final Map<String, dynamic> creationParams = {'content': 'Flutter傳給原生iOSView的參數'};return UiKitView(viewType: viewType,creationParams: creationParams,creationParamsCodec: const StandardMessageCodec(),);}
}

注冊路由

static const String nativaPage = '/nativaPage';
 nativaPage: (settings, uniqued) {return MaterialPageRoute(settings: settings,builder: (_) {return const CMNativePage();});},

在Flutter地方使用

 TextButton(child: const Text("加載原生控件"),onPressed: () {BoostNavigator.instance.push(HYRouter.nativaPage, arguments: {"home": "home頁面傳遞數值"});// showBottomWidget(context, const CMNativePage());},),

到此Flutter中也完成集成。
如果想要某些彈出樣式,自己再進行處理。這里只是簡單的使用Flutter 內嵌 iOS原生view。

注意事項

  1. FlutterIosTextLabelFactory中的createArgsCodec方法一定不能遺漏,否則會導致傳值不成功。類型也一定要和Dart部分的native.dart->IOSCompositionWidget-> UiKitView-> creationParamsCodec保持一致。否則會導致崩潰。
  2. 使用官方文檔中的寫法是沒有問題,但是本案例中使用了flutter_boost,再跟著官網集成就會出現問題。需要更flutter_boost初始化完成,再對FlutterEngine對插件進行初始化。
  3. 其中withId:xxx,xxx代表控件的ID,需要和Dart部分的IOSCompositionWidget中的viewType保持一致。命名為:custom_platform_view
  4. 其中registrarForPlugin:xxx,xxx代表插件的ID。命名為:custom_platform_view_plugin

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/39721.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/39721.shtml
英文地址,請注明出處:http://en.pswp.cn/news/39721.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SAP動態安全庫存簡介

動態安全庫存:跑需求計劃時,ERP系統按設置的庫存方式自動計算出滿足一定時間內可保障生產的庫存數量 SAP動態安全庫存的計算公式:動態安全庫存=平均日需求*覆蓋范圍。 平均日需求=特定時期內的總需求/特定時期內的工作天數 覆蓋范圍指在沒又貨物供應的情況下,庫存可以維…

稀疏感知圖像和體數據恢復的系統對象研究(Matlab代碼實現)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;歡迎來到本博客????&#x1f4a5;&#x1f4a5; &#x1f3c6;博主優勢&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客內容盡量做到思維縝密&#xff0c;邏輯清晰&#xff0c;為了方便讀者。 ??座右銘&a…

STM32 F103C8T6學習筆記6:IIC通信__驅動MPU6050 6軸運動處理組件—一階互補濾波

今日主要學習一款傾角傳感器——MPU6050,往后對單片機原理基礎講的會比較少&#xff0c;更傾向于簡單粗暴地貼代碼&#xff0c;因為經過前些日子對MSP432的學習&#xff0c;對原理方面也有些熟絡了&#xff0c;除了在新接觸它時會對其引腳、時鐘、總線等進行仔細一些的研究之外…

ATF(TF-A)安全通告 TFV-5 (CVE-2017-15031)

安全之安全(security)博客目錄導讀 ATF(TF-A)安全通告匯總 目錄 一、ATF(TF-A)安全通告 TFV-5 (CVE-2017-15031) 二、CVE-2017-15031 一、ATF(TF-A)安全通告 TFV-5 (CVE-2017-15031) Title 未初始化或保存/恢復PMCR_EL0可能會泄露安全世界的時間信息 CVE ID CVE-2017-1503…

101.for循環語句練習題-求數列前n項的平方和

【目錄】 文章目錄 101.for循環語句練習題-求數列前n項的平方和1. 求數列前n項的平方和2. 冪函數3. f 字符串格式化語法4. 基礎代碼5. 自定義函數代碼6. 遞歸函數代碼7. 代碼總結 【正文】 101.for循環語句練習題-求數列前n項的平方和 1. 求數列前n項的平方和 【目標任務】 …

spark的standalone 分布式搭建

一、環境準備 集群環境hadoop11&#xff0c;hadoop12 &#xff0c;hadoop13 安裝 zookeeper 和 HDFS 1、啟動zookeeper -- 啟動zookeeper(11,12,13都需要啟動) xcall.sh zkServer.sh start -- 或者 zk.sh start -- xcall.sh 和zk.sh都是自己寫的腳本-- 查看進程 jps -- 有…

C++中配置OpenCV的教程

首先去OpenCV的官網下載OpenCV安裝包&#xff0c;選擇合適的平臺和版本進行下載&#xff0c;我下載的是Windows的OpenCV-4.7.0版本。OpenCV下載地址 下載好后&#xff0c;解壓到自己指定的路徑。 配置環境變量&#xff1a; WinR鍵打開運行窗口&#xff0c;輸入sysdm.cpl打開系…

星星之火:國產訊飛星火大模型的實際使用體驗(與GPT對比)

#AIGC技術內容創作征文&#xff5c;全網尋找AI創作者&#xff0c;快來釋放你的創作潛能吧&#xff01;# 文章目錄 1 前言2 測試詳情2.1 文案寫作2.2 知識寫作2.3 閱讀理解2.4 語意測試&#xff08;重點關注&#xff09;2.5 常識性測試&#xff08;重點關注&#xff09;2.6 代碼…

常識判斷

頭像 carrin&#xff5e;&#x1f47b; 產品經理 225/753 75/302.5 30/152 15/101.5 等差數列&#xff0c;所以最后一個是10/101 收起 60 回復 發布于 2020-02-18 16:33

Mysql之explain詳解

1. explain作用 使用explain可以展示出sql語句的執行計劃&#xff0c;再根據sql的執行計劃去判斷這條sql有哪些點可以進行優化&#xff0c;從而讓sql的效率達到最大化。 2. 執行計劃各列含義 &#xff08;1&#xff09;id&#xff1a;id列是select的序列號&#xff0c;這個…

React18TS項目:配置react-css-modules,使用styleName

他的好處不說了 網上一堆文章一個能打的都沒有&#xff0c; 添加開發依賴 pnpm add -D dr.pogodin/babel-plugin-react-css-modules types/react-css-modules Babel Plugin "React CSS Modules" | Dr. Pogodin Studio 看dr.pogodin/babel-plugin-react-css-mo…

centos7安裝erlang及rabbitMQ

下載前注意事項&#xff1a; 第一&#xff1a;自己的系統版本&#xff0c;centos中uname -a指令可以查看&#xff0c;el8&#xff0c;el7&#xff0c;rabbitMQ的包不一樣&#xff01; 第二&#xff1a;根據rabbitMQ中erlang version找到想要下載rabbitMQ對應erlang版本&#x…

封裝、繼承、多態

封裝是什么&#xff1f; 封裝是面向對象的特征之一&#xff0c;是對象和類概念的主要特性。 封裝&#xff0c;也就是把客觀事物封裝成抽象的類&#xff0c;并且類可以把自己的數據和方法只讓可信的類或者對象操作&#xff0c;對不可信的進行信息隱藏。 封裝&#xff0c;是把客觀…

C++儲備

一、類的 三大特性 封裝&#xff0c;繼承&#xff0c;多態 二、虛函數 為啥要用到虛函數 C虛函數詳解_Whitesad_的博客-CSDN博客 三、函數重載 四、封裝的保護權限 1.public 成員類內&#xff0c;內外都可以訪問 2.protected 成員&#xff0c;類內可以訪問&#xff0c…

大牛分析相機鏡頭光學中疑難問題

1、變焦和對焦有什么區別? 變焦就是改變鏡頭的焦距(準確說是像距),以改變拍攝的視角,也就是通常所說的把被攝體拉近或推遠。例如18-55mm和70-200mm鏡頭就是典型的變焦鏡頭。焦距越長,視角越窄。 對焦通常指調整鏡片組和底片(傳感器平面)之間的距離,從而使被攝物在CC…

SElinux 導致 Keepalived 檢測腳本無法執行

哈嘍大家好&#xff0c;我是咸魚 今天我們來看一個關于 Keepalived 檢測腳本無法執行的問題 一位粉絲后臺私信我&#xff0c;說他部署的 keepalived 集群 vrrp_script 模塊中的腳本執行失敗了&#xff0c;但是手動執行這個腳本卻沒有任何問題 這個問題也是咸魚第一次遇到&…

《安富萊嵌入式周報》第320期:鍵盤敲擊聲解碼, 軍工級boot設計,開源CNC運動控制器,C語言設計筆記,開源GPS車輛跟蹤器,一鍵生成RTOS任務鏈表

周報匯總地址&#xff1a;嵌入式周報 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬漢嵌入式論壇 - Powered by Discuz! 視頻版&#xff1a; https://www.bilibili.com/video/BV1Cr4y1d7Mp/ 《安富萊嵌入式周報》第320期&#xff1a;鍵盤敲擊…

【智慧工地源碼】:人工智能、BIM技術、機器學習在智慧工地的應用

智慧工地云平臺是專為建筑施工領域所打造的一體化信息管理平臺。通過大數據、云計算、人工智能、BIM、物聯網和移動互聯網等高科技技術手段&#xff0c;將施工區域各系統數據匯總&#xff0c;建立可視化數字工地。同時&#xff0c;圍繞人、機、料、法、環等各方面關鍵因素&…

理解持續測試,才算理解DevOps

軟件產品的成功與否&#xff0c;在很大程度上取決于對市場需求的及時把控&#xff0c;采用DevOps可以加快產品交付速度&#xff0c;改善用戶體驗&#xff0c;從而有助于保持領先于競爭對手的優勢。 作為敏捷開發方法論的一種擴展&#xff0c;DevOps強調開發、測試和運維不同團…

centos如何安裝libssl-dev libsdl-dev libavcodec-dev libavutil-dev ffmpeg

在 CentOS 系統上安裝這些包可以按照以下步驟進行&#xff1a; 打開終端&#xff0c;使用 root 或具有管理員權限的用戶登錄。 使用以下命令安裝 libssl-dev 包&#xff1a; yum install openssl-devel使用以下命令安裝 libsdl-dev 包&#xff1a; yum install SDL-devel使用以…