Flutter如何支持原生View

在 Flutter 中集成原生 View(如 Android 的 SurfaceView、iOS 的 WKWebView)是通過 平臺視圖(Platform View) 實現的。這一機制允許在 Flutter UI 中嵌入原生組件,解決了某些場景下 Flutter 自身渲染能力的不足(如高性能視頻播放、3D 渲染、復雜地圖等)。以下是詳細介紹:

一、平臺視圖的兩種實現方式

1. 虛擬平臺視圖(Virtual Platform Views)

特性:Flutter 直接渲染原生 View,性能較高,支持混合渲染。
適用場景:Android 8.0+(API level 26)和 iOS。
實現方式:使用 AndroidView(Android)或 UiKitView(iOS)。

2. 混合平臺視圖(Hybrid Composition)

特性:原生 View 獨立于 Flutter 渲染樹,性能略低但兼容性更好。
適用場景:Android 7.0 及以下版本,或需要與復雜原生組件集成。
實現方式:在 AndroidView 或 UiKitView 中設置 platformViewType 并啟用混合模式。

二、基本實現步驟

1. Android 端集成(以 WebView 為例)

// Flutter 代碼
import 'package:flutter/material.dart';class NativeWebView extends StatelessWidget {Widget build(BuildContext context) {if (Theme.of(context).platform == TargetPlatform.android) {return AndroidView(viewType: 'webview', // 與原生端注冊的類型名一致creationParams: {'url': 'https://example.com'},creationParamsCodec: const StandardMessageCodec(),);} else if (Theme.of(context).platform == TargetPlatform.iOS) {return UiKitView(viewType: 'webview',creationParams: {'url': 'https://example.com'},creationParamsCodec: const StandardMessageCodec(),);}return Text('不支持的平臺');}
}
// Android 原生代碼(Kotlin)
class MainActivity : FlutterActivity() {override fun configureFlutterEngine(flutterEngine: FlutterEngine) {super.configureFlutterEngine(flutterEngine)// 注冊平臺視圖工廠flutterEngine.platformViewsController.registry.registerViewFactory("webview", WebViewFactory())}
}class WebViewFactory : PlatformViewFactory(StandardMessageCodec.INSTANCE) {override fun create(context: Context, viewId: Int, args: Any?): PlatformView {val creationParams = args as Map<String, Any>?return WebViewPlatformView(context, viewId, creationParams)}
}class WebViewPlatformView(private val context: Context,viewId: Int,params: Map<String, Any>?
) : PlatformView {private val webView: WebView = WebView(context)init {val url = params?.get("url") as? String ?: "https://example.com"webView.settings.javaScriptEnabled = truewebView.loadUrl(url)}override fun getView(): View = webViewoverride fun dispose() {webView.destroy()}
}

2. iOS 端集成(Swift)

// iOS 原生代碼(Swift)
import Flutter
import WebKitclass WebViewFactory: NSObject, FlutterPlatformViewFactory {private let messenger: FlutterBinaryMessengerinit(messenger: FlutterBinaryMessenger) {self.messenger = messengersuper.init()}func create(withFrame frame: CGRect, viewIdentifier viewId: Int64, arguments args: Any?) -> FlutterPlatformView {let params = args as? [String: Any]return WebViewPlatformView(frame: frame, viewId: viewId, params: params, messenger: messenger)}func createArgsCodec() -> FlutterMessageCodec & NSObjectProtocol {return FlutterStandardMessageCodec.sharedInstance()}
}class WebViewPlatformView: NSObject, FlutterPlatformView {private let webView: WKWebViewinit(frame: CGRect, viewId: Int64, params: [String: Any]?, messenger: FlutterBinaryMessenger) {let config = WKWebViewConfiguration()webView = WKWebView(frame: frame, configuration: config)super.init()if let urlString = params?["url"] as? String, let url = URL(string: urlString) {webView.load(URLRequest(url: url))}}func view() -> UIView {return webView}
}// 在 AppDelegate 中注冊
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {override func application(_ application: UIApplication,didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {let registrar = self.registrar(forPlugin: "WebViewPlugin")registrar?.register(WebViewFactory(messenger: registrar!.messenger()), withId: "webview")return super.application(application, didFinishLaunchingWithOptions: launchOptions)}
}

三、性能優化與注意事項

1. 性能優化

優先使用虛擬平臺視圖:在支持的設備上(Android 8.0+、iOS),默認使用 AndroidView/UiKitView,避免混合渲染的開銷。
減少重繪:原生 View 的重繪成本較高,避免頻繁刷新。
懶加載:在需要顯示時才創建,使用后及時釋放資源。

2. 注意事項

混合渲染限制:混合平臺視圖不支持 Flutter 的一些特性(如透明度、變換動畫)。
平臺差異:同一功能在 Android 和 iOS 上的實現可能不同,需分別處理。
內存管理:確保在組件銷毀時釋放原生資源(如 dispose() 方法)。

四、常見應用場景

視頻播放:集成原生視頻播放器(如 Android 的 ExoPlayer、iOS 的 AVPlayer)。
地圖組件:嵌入 Google Maps、高德地圖等復雜地圖控件。
3D 渲染:集成 OpenGL 或 AR 場景。
遺留系統集成:復用已有原生組件,避免重復開發。

五、第三方插件推薦

如果不想手動實現,可以使用以下成熟插件:
webview_flutter:官方 WebView 插件,支持 Android 和 iOS。
google_maps_flutter:官方地圖插件,基于原生地圖組件。
video_player:官方視頻播放插件,集成原生播放器。

六、總結

Flutter 的平臺視圖機制為與原生組件集成提供了強大支持,通過合理選擇實現方式(虛擬或混合)和優化策略,可以在保持 Flutter 開發效率的同時,獲得接近原生的性能體驗。但需注意其限制,避免在關鍵路徑上過度使用,以保證應用的整體流暢性。

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

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

相關文章

vue-11(命名路由和命名視圖)

命名路由和命名視圖 命名路由和命名視圖提供了組織和導航 Vue.js 應用程序的強大方法&#xff0c;尤其是在它們的復雜性增加時。它們提供了一種語義更合理、可維護的路由方法&#xff0c;使您的代碼更易于理解和修改。命名路由允許您按名稱引用路由&#xff0c;而不是依賴 URL…

微軟認證考試科目眾多?該如何選擇?

在云計算、人工智能、數據分析等技術快速發展的今天&#xff0c;微軟認證&#xff08;Microsoft Certification&#xff09;已成為IT從業者、開發者、數據分析師提升競爭力的重要憑證。但面對眾多考試科目&#xff0c;很多人不知道如何選擇。本文將詳細介紹微軟認證的考試方向、…

視頻匯聚平臺EasyCVR“明廚亮灶”方案筑牢旅游景區餐飲安全品質防線

一、背景分析? 1&#xff09;政策監管剛性需求?&#xff1a;國家食品安全戰略及 2024年《關于深化智慧城市發展的指導意見》要求構建智慧餐飲場景&#xff0c;推動數字化監管。多地將“AI明廚亮灶”納入十四五規劃考核&#xff0c;要求餐飲單位操作可視化并具備風險預警能力…

Mysql莫名奇妙重啟

收到客戶反饋有時接口報504&#xff0c;查看應用日志發現故障期間數據庫連接失敗 com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failureThe last packet sent successfully to the server was 0 milliseconds ago. The driver has not receive…

半監督學習:低密度分離假設 (Low-Density Separation Assumption)

半監督學習(SSL)的目標是借助未標記數據輔助訓練&#xff0c;以期獲得比僅用帶標簽的監督學習范式更好的效果。但是&#xff0c;SSL的前提是數據分布需滿足某些假設。否則&#xff0c;SSL可能無法提升監督學習的效果&#xff0c;甚至會因誤導性推斷降低預測準確性。 半監督學習…

Python Day44

Task&#xff1a; 1.預訓練的概念 2.常見的分類預訓練模型 3.圖像預訓練模型的發展史 4.預訓練的策略 5.預訓練代碼實戰&#xff1a;resnet18 1. 預訓練的概念 預訓練&#xff08;Pre-training&#xff09;是指在大規模數據集上&#xff0c;先訓練模型以學習通用的特征表示&am…

vue3 eslint ts 關閉多單詞命名檢查

無效做法 import { globalIgnores } from eslint/config import {defineConfigWithVueTs,vueTsConfigs, } from vue/eslint-config-typescript import pluginVue from eslint-plugin-vue import skipFormatting from vue/eslint-config-prettier/skip-formatting// To allow m…

貪心,回溯,動態規劃

1.貪心算法 ? 貪心算法是一種在每一步選擇中都采取在當前狀態下最好或最優的選擇&#xff0c;從而希望全局最好或是最優的算法。 特點 局部最優選擇不能保證全局最優高效 適用條件 局部最優可以導致全局最優問題的最優解包含子問題的最優解 經典問題 活動選擇問題最短路徑最…

【Netty4核心原理⑧】【揭開Bootstrap的神秘面紗 - 服務端Bootstrap?】

文章目錄 一、前言二、流程分析1. 創建 EventLoopGroup2. 指定 Channel 類型2.1 Channel 的創建2.2 Channel 的初始化 3. 配置自定義的業務處理器 Handler3.1 ServerBootstrap#childHandler3.2 handler 與 childHandler 的區別 4. 綁定端口服務啟動 三、bossGroup 與 workerGro…

為什么需要自動下載瀏覽器驅動?

為什么需要自動下載瀏覽器驅動&#xff1f; 血淚場景重現 新人入職第一天&#xff1a; 花3小時配置Chrome/Firefox驅動版本不匹配導致SessionNotCreatedException 瀏覽器自動更新后&#xff1a; 所有測試腳本突然崩潰手動查找驅動耗時長 終極解決方案&#xff1a;自動下載驅…

NLP常用工具包

?做一次按NLP項目常見工具的使用拆解 1. tokenizer from torchtext.data.utils import get_tokenizertokenizer get_tokenizer(basic_english) text_sample "Were going on an adventure! The weather is really nice today." tokens tokenizer(text_sample) p…

在 Vue 的template中使用 Pug 的完整教程

在 Vue 的template中使用 Pug 的完整教程 引言 什么是 Pug&#xff1f; Pug&#xff08;原名 Jade&#xff09;是一種高效的網頁模板引擎&#xff0c;通過縮進式語法和簡潔的寫法減少 HTML 的冗長代碼。Pug 省略了尖括號和閉合標簽&#xff0c;使用縮進定義結構&#xff0c;…

【Android基礎回顧】四:ServiceManager

Android 中的 ServerManager 是 Android 框架中一個用于管理系統服務的核心機制。它是 Binder IPC 的一部分&#xff0c;用于在客戶端和服務端之間建立聯系&#xff0c;廣泛應用于系統服務&#xff08;如 ActivityManager、WindowManager 等&#xff09;的注冊與獲取。 1 Serv…

【Android基礎回顧】一:Binder機制是什么?有什么用?

Android中的Binder機制是Android系統中最核心和最基礎的進程間通訊機制。 1 什么是進程間通訊機制(IPC)&#xff1f; 眾所周知&#xff0c;Android系統基于Linux開發&#xff0c;Linux系統里面本來就有進程間通訊機制。 1.1 Linux的IPC(Inter-Process Communication)概覽 它…

Go語言爬蟲系列教程5:HTML解析技術以及第三方庫選擇

Go語言爬蟲系列教程5&#xff1a;HTML解析技術以及第三方庫選擇 在上一章中&#xff0c;我們使用正則表達式提取網頁內容&#xff0c;但這種方法有局限性。對于復雜的HTML結構&#xff0c;我們需要使用專門的HTML解析庫。在這一章中&#xff0c;我們將介紹HTML解析技術以及如何…

AtCoder 第408?場初級競賽 A~E題解

A Timeout 【題目鏈接】 原題鏈接:A - Timeout 【考點】 模擬 【題目大意】 長老會在 s 秒后睡去,進過 n 次叫醒,長老最后能否是保持清醒。 【解析】 模擬每一次拍擊叫醒的過程,查看本次時間距上次時間是否大于 s。注意:第一次拍擊叫醒應和 0 秒相減。 【難度】 …

Unity VR/MR開發-VR設備與適用場景分析

視頻講解鏈接&#xff1a;【XR馬斯維】VR/MR設備與適用場景分析&#xff1f;【UnityVR/MR開發教程--入門】_游戲熱門視頻

MyBatis 查詢功能實現全流程

一、創建maven項目 配置好相應的jdk 二、在數據庫建立相應的表格 1.因為Mybatis實際是對sql表的一系列操作&#xff0c;所以我們新建一個數據庫 2.在查詢界面運行下面指令創建一個user表 CREATE TABLE user (id int(11) NOT NULL AUTO_INCREMENT,username varchar(32) NOT NU…

tcp/udp

tcp/udp協議概述 傳輸層協議基本概念 傳輸層協議建立在網絡層和會話層之間&#xff0c;為應用層實體提供端到端的通信功能&#xff0c;確保數據包的順序傳送及數據的完整性。它利用網絡層提供的服務&#xff0c;并通過傳輸層地址&#xff08;端口號&#xff09;提供給高層用戶…

k8s集群安裝坑點匯總

前言 由于使用最新的Rocky9.5,導致kubekey一鍵安裝用不了&#xff0c;退回Rocky8麻煩機器都建好了&#xff0c;決定手動安裝k8s&#xff0c;結果手動安裝過程中遇到各種坑&#xff0c;這里記錄下&#xff1b; k8s安裝 k8s具體安裝過程可自行搜索&#xff0c;或者deepseek; 也…