Flutter 與 Android 的互通幾種方式

Flutter 與 Android 的互通主要通過以下幾種方式實現,每種方式適用于不同的場景:


1. 平臺通道(Platform Channels)

Flutter 與原生 Android 代碼通信的核心方式,支持雙向調用。

類型
  • MethodChannel:雙向方法調用(最常用)
  • EventChannel:用于原生向 Flutter 發送事件流(如傳感器數據)
  • BasicMessageChannel:簡單的消息傳遞(較少使用)
示例(MethodChannel)
// Flutter 側(Dart)
const channel = MethodChannel('com.example/app');
Future<void> getNativeData() async {try {final String result = await channel.invokeMethod('getData');print('原生返回: $result');} on PlatformException catch (e) {print('調用失敗: ${e.message}');}
}
// Android 側(Kotlin)
class MainActivity : FlutterActivity() {override fun configureFlutterEngine(flutterEngine: FlutterEngine) {super.configureFlutterEngine(flutterEngine)MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "com.example/app").setMethodCallHandler { call, result ->if (call.method == "getData") {result.success("Hello from Android!")} else {result.notImplemented()}}}
}

2. 插件(Plugins)

封裝原生功能的可復用模塊,社區或官方提供(如相機、定位等)。

使用步驟
  1. 添加依賴pubspec.yaml):
    dependencies:url_launcher: ^6.0.0
    
  2. 調用插件
    import 'package:url_launcher/url_launcher.dart';
    Future<void> launchURL() async {if (await canLaunch('https://flutter.dev')) {await launch('https://flutter.dev');}
    }
    
自定義插件

通過 flutter create --template=plugin 生成插件模板,自動生成平臺通道代碼。


3. 平臺視圖(Platform Views)

在 Flutter 中嵌入原生 Android 控件(如 WebView、地圖)。

示例(嵌入 Android View)
// Flutter 側
Widget build(BuildContext context) {return AndroidView(viewType: 'native_view',creationParams: {'text': 'Flutter傳遞的參數'},creationParamsCodec: StandardMessageCodec(),);
}
// Android 側注冊視圖
class NativeViewFactory : PlatformViewFactory(StandardMessageCodec.INSTANCE) {override fun create(context: Context, id: Int, args: Any?): PlatformView {val params = args as Map<String, Any>return NativeView(context, params["text"] as String)}
}// 在 FlutterActivity 中注冊
flutterEngine.platformViewsController.registry.registerViewFactory("native_view", NativeViewFactory()
)

4. 直接調用原生 Activity/Service

從 Flutter 啟動 Android 原生頁面或服務。

示例
// Flutter 側
const channel = MethodChannel('com.example/activity');
Future<void> startNativeActivity() async {await channel.invokeMethod('startVideoPlayer', {'url': 'video.mp4'});
}
// Android 側
MethodChannel(flutterEngine.dartExecutor, "com.example/activity").setMethodCallHandler { call, result ->if (call.method == "startVideoPlayer") {val url = call.argument<String>("url")val intent = Intent(this, VideoPlayerActivity::class.java).apply {putExtra("videoUrl", url)}startActivity(intent)result.success(null)}
}

5. 數據共享

通過共享存儲(如 SharedPreferences、數據庫)傳遞數據。

示例(SharedPreferences)
// Flutter 側
final prefs = await SharedPreferences.getInstance();
await prefs.setString('token', 'abc123');
// Android 側讀取(同一文件)
val prefs = getSharedPreferences("FlutterSharedPreferences", MODE_PRIVATE)
val token = prefs.getString("flutter.token", "") // 注意鍵名前綴 `flutter.`

6. FFI(Foreign Function Interface)

直接調用 C/C++ 代碼(通過 dart:ffi),適用于高性能計算或底層操作。

適用場景
  • 調用現有的 C/C++ 庫。
  • 需要極致性能的模塊(如圖像處理)。

如何選擇?

場景推薦方式
簡單方法調用MethodChannel
持續事件監聽(如傳感器)EventChannel
復用社區功能(如相機)Plugins
嵌入復雜原生控件Platform Views
啟動原生頁面調用 Activity/Service
共享簡單數據SharedPreferences
高性能原生代碼交互FFI

注意事項

  1. 線程問題:原生代碼默認在 UI 線程執行,耗時操作需切換到子線程。
  2. 異步處理:Flutter 側使用 Future,原生側需調用 result.success()result.error()
  3. 性能:頻繁跨平臺通信可能影響性能,盡量批量傳遞數據。

通過合理選擇這些方式,可以無縫結合 Flutter 的跨平臺優勢與 Android 的原生能力。

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

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

相關文章

全新開源AI知識庫系統!PandaWiki一鍵構建智能文檔,支持AI問答、創作與搜索!

傳統 Wiki 工具像一本厚重的“死書”&#xff0c;雖能存儲信息&#xff0c;卻無法主動「思考」。而在當今AI席卷各個行業的浪潮中&#xff0c;知識管理也迎來了智能化的巨大飛躍。最近開源圈悄然走紅的 PandaWiki&#xff0c;就用 AI 大模型為知識庫注入了 靈魂&#xff0c; 它…

Rust 結構體

Rust 結構體 引言 Rust 是一種系統編程語言,以其內存安全、并發支持和零成本抽象而聞名。結構體(struct)是 Rust 中用于創建自定義數據類型的工具。本文將深入探討 Rust 結構體的概念、用法以及其在實際編程中的應用。 結構體的定義 在 Rust 中,結構體是一種復合類型,…

lstm 數據輸入問題

lstm 我有 20*6 條數據&#xff0c;20個樣本&#xff0c;每個樣本6條歷史數據&#xff0c;每條數據有5個值&#xff0c;我送給網絡輸入時應該是20*6*5 還是 6*20*5你的數據是&#xff1a;20 個樣本&#xff08;batch size 20&#xff09;每個樣本有 6 條歷史數據&#xff08;s…

WPF打包exe應用的圖標問題

目錄 1、WPF打包方法 2、圖標問題 1、WPF打包方法 使用Microsoft Visual Studio Installer Projects 2022工具打包&#xff08;成功&#xff09;&#xff0c;需要新建Setup Project項目進行打包 (46 封私信) [C#.net資料]visual studio打包可安裝的exe程序(添加配置文件)&am…

Qt中處理多個同類型對象共享槽函數應用

一.Qt中處理多個同類型對象共享槽函數應用場景數字鍵盤按鈕處理動態生成的控件管理工具欄按鈕響應游戲中的網格點擊處理使用時需特別注意對象生命周期管理和類型安全&#xff0c;現代Qt開發中更推薦使用Lambda表達式替代sender()機制。二.示例1.本文示例功能在ui界面添加5個&am…

康養休閑旅游服務實訓室建設方案:理實一體化的產教融合方案

一、康養休閑旅游服務實訓室建設方案建設原則對接行業真實場景&#xff1a;實訓環境與設備設施嚴格參照健康咨詢、旅行社及相關服務、住宿業、餐飲業等行業的真實職業場景搭建&#xff0c;確保實訓項目與崗位工作內容高度匹配&#xff0c;實現工學結合、理實一體化教學。融合前…

微服務架構的演進:邁向云原生——Java技術棧的實踐之路

隨著云計算技術的快速發展&#xff0c;微服務架構正逐步向云原生&#xff08;Cloud Native&#xff09;演進。云原生不僅是一種技術體系&#xff0c;更是一種開發和運維理念的革新。本文將以Java技術棧為例&#xff0c;結合Kubernetes&#xff08;K8s&#xff09;、服務網格&am…

CVE-2025-32463復現

目錄背景知識chroot環境chroot 環境的具體表現Name Service Switch (NSS)機制漏洞簡介環境搭建復現POC分析防御方法參考文章&#xff1a;背景知識 chroot環境 &#xff08;全稱“change root”&#xff09;是一種Unix/Linux系統中的隔離技術&#xff0c;其核心作用是將進程的…

原生微信小程序研發,如何對圖片進行統一管理?

目標&#xff1a; 統一在配置文件中管理圖片&#xff0c;用變量存儲&#xff0c;換圖標時只需修改鏈接即可&#xff0c;無需更改業務代碼&#xff0c;且方便查找。tips: 不建議在 asset 中存儲大量圖片&#xff0c;原因是官方要求小程序內存要限制在2M以內&#xff0c;圖片放多…

Escrcpy(手機投屏) v1.27.2 便攜版

Escrcpy 是一款強大的工具&#xff0c;它允許用戶通過圖形化的 Scrcpy 界面來顯示和控制他們的 Android 設備。這款應用程序由 Electron 作為其底層框架驅動。Escrcpy 無需任何賬戶就可以使用&#xff0c;無需擔心隱私或安全問題。Escrcpy沒有廣告&#xff0c;完全免費開源。軟…

element-plus表單校驗失敗問題

一、問題&#xff1a;做表單校驗時&#xff0c;自定義校驗和常規校驗都失敗&#xff0c;自定義校驗時無法拿到value值。二、原因&#xff1a;1、變量名稱那沒有綁定prop。如果是常規校驗&#xff0c;沒綁定prop的話&#xff0c;在確定按鈕時&#xff0c;valid都是true。2、自定…

jmeter做跨線程組

多線程通常會將不同的業務邏輯分配到不同的線程組中。為什么要做多線程&#xff1a;模擬真實世界場景&#xff1a;在實際應用中&#xff0c;服務器通常需要同時處理來自多個用戶的請求。通過多線程&#xff0c;JMeter可以模擬這種并發用戶的行為&#xff0c;更準確地反映出應用…

SQL實戰:多表查詢篇

文章目錄多表查詢創建練習用的數據庫鏈接/連接查詢交叉連接自然連接內連接(取交集)外連接左外連接/右外連接自連接子查詢聯合查詢總結數據庫的備份和恢復命令行操作多表查詢 -- 獲得 alice的 部門所在城市 select * from staff where namealice; -- 獲得dept_id1 select city …

交通銀行基于HarmonyOS數字盾服務,實現大額轉賬安全

在近日落幕的華為開發者大會2025&#xff08;6月20日-6月22日&#xff09;上&#xff0c;交通銀行作為HarmonyOS安全合作的關鍵伙伴受邀出席。在大會的主題演講上介紹了交通銀行基于HarmonyOS SDK設備安全服務&#xff08;Device Security Kit&#xff09;中的數字盾服務&#…

加密狗硬復制的方法

加密狗硬復制方法概述&#xff1a;Greer82加密狗&#xff08;Dongle&#xff09;是一種硬件加密設備&#xff0c;用于軟件版權保護。硬復制是指通過物理手段復制加密狗的硬件信息&#xff0c;通常涉及破解或仿制。需要注意的是&#xff0c;未經授權的復制可能涉及法律風險&…

家庭網絡中的服務器怎么對外提供服務?

家庭網絡中的服務器怎么對外提供服務&#xff1f;方案1 DDNS&#xff08;家庭網絡需要有公網ip&#xff09;方案2 內網穿透&#xff08;需要有一臺公網ip的服務器&#xff09;方案1 DDNS&#xff08;家庭網絡需要有公網ip&#xff09; 怎么判斷是否有公網ip&#xff1f;大致的流…

UnrealEngine5游戲引擎實踐(C++)

目錄 目錄 目錄 Unreal Engine 是什么? Unreal Engine 5 簡介 核心技術特性 應用場景擴展 兼容性與生態系統 Unreal Engine安裝 下載 Epic Games Launcher 啟動 Unreal Engine 選擇安裝版本和路徑 選擇組件 開始安裝 驗證安裝 配置項目模板(可選) 更新和插件…

web滲透sql注入4之PostgreSQL

web滲透sql注入4之PostgreSQLPostgreSQL數據庫特性&#xff1a;基于角色的訪問控制&#xff0c;支持超級用戶&#xff0c;需安裝 plpgsql 擴展方可執行命令&#xff0c;可通過 COPY命令或自定義函數實現權限判斷白盒看代碼&#xff0c;黑盒通過構造特殊查詢語句探測數據庫權限權…

2025年7月:打cs1.5 600元裝機臺式電腦方案A

打cs1.5 600元裝機方案A&#xff1a;有需要的小伙伴可以收藏哈&#xff0c;目前我沒有機會實測效果&#xff0c;理論值是ok無壓力的&#xff0c;大家 有機會配置后的&#xff0c;也可以自行測試下CS1.5的FPS值穩定否哈哈。 打cs1.5 600元裝機方案A&#xff1a; 點擊查看詳細內…

人大金倉下載安裝教程總結

文章目錄前言背景&#xff1a; 工作中進行信創改造&#xff0c;需要把mysql&#xff0c;postgresql數據遷移到人大金倉一、人大金倉是什么&#xff1f;二、使用場景三、下載安裝教程四、優勢五、環境及要求六、工具以及詞匯介紹總結前言 背景&#xff1a; 工作中進行信創改造&…