Flutter調用平台代碼
前言
在前面的文章中我們講了許多Flutter中的組件和Flutter中的特定操作,但是單單使用Flutter里的組件和方法是不夠的。
就像以前我們講到文件存儲、資料庫操作單單靠使用Flutter我們是不能完成的,因為這些數據最終需要存儲在特定的終端平台上,我們需要通過特點的代碼來實現與特點的平台交互,所以我們引入了第三方庫來完成這些操作。
當然,這些第三方庫幫我們實現了與不同平台交互的代碼,所以我們不需要自己再去自己去編寫這些與特定平台交互的代碼。
當時我們你不可能一直使用人家的第三方庫啊,一些特定的功能是沒人能幫你的,所以我們還是很有必要來學習下如何跟特定的平台交互的
原諒我不會Object C ,不會Ios開發,這裡僅僅以Android為例來做今天的例子
平台通道
Flutter使用了一個靈活的系統,允許您調用特定平台的API,無論在Android上的Java或Kotlin代碼中,還是iOS上的ObjectiveC或Swift代碼中均可用。
Flutter平台特定的API支持不依賴於代碼生成,而是依賴於靈活的消息傳遞的方式
應用的Flutter部分通過平台通道(platform channel)將消息發送到其應用程序的所在的宿主(iOS或Android)。
宿主監聽的平台通道,並接收該消息。然後它會調用特定於該平台的API(使用原生編程語言) - 並將響應發送回客戶端,即應用程序的Flutter部分。
用平台通道在客戶端(Flutter UI)和宿主(平台)之間傳遞消息,如下圖所示:
在客戶端,MethodChannel 可以發送與方法調用相對應的消息。 在宿主平台上,MethodChannel 在Android((API) 和FlutterMethodChannel iOS (API) 可以接收方法調用並返回結果。
接下來我們來個例子看看
調用Android平台Toast
在自前面我們可以很清楚的看到在Android平台我們需要藉助於MethodChannel來與Android平台代碼交互。我們通過代碼來講解下如何使用
首先我們需要在我們的Dart代碼中定義我們的想要調用的通道
當然這個頻道的名字是可以自己定義的的,但是必須要要和一會在Android MainActivity中使用的一致。
然後,我們同個通道來調用在Android平台定義的方法
使用platform.invokeMethod(「showToast」,{「msg」:msg})來調用我們在Android平台定義的「showToast」方法
接下來,我們來看下我們在Android Activity做了哪些事情
然後我們創建了一個MethodChannel對象並對回調多了處理
當回調中參數的method方法和我們在dart中定義的一樣時,我們就調用Android平台的Toast方法彈出吐司,如果msg為空則彈出toast text must not null的吐司。
當我們點擊flutter程序中的按鈕時,就會觸發調用Android系統的Toast回調。
看下效果:
GIF
從Android平台獲取數據
和上面的類似,我們可以調用系統的方法,我們同樣刻印調用我們自己寫的方法並且返回調用方法的值,那麼我們還是舉個例子看下吧。
我們通過flutter調用Android平台的方法獲取當前格式化好的時間。
同樣的我們還是用用和剛才一樣的通道,只不過這一次我們需要更改我們調用的方法即可。
我們使用一個泛型為String的Future對象來接收Androd平台傳來的字元串信息。然後調用then來顯示字元串。
在MainActivity中我們定義一個getCurrentTime的方法,當觸發方法名為getAndroidTime時調用改方法並返回給Flutter調用處。
下面就是效果了:
GIF
獲取系統回調與監聽
在前面的Flutter與平台的交互圖上我們可以看到,使用MethodChannel可以調用原生平台的方法,在上面的例子中我們呢也給大家演示了如何使用,但是我們如何獲取原生平台的監聽與回調呢?類似於Android中的廣播我們如何在Flutter接收到呢?
下面我們就需要來看下EventChannel了,藉助於EventChannel(事件通道)我們可以很輕易的接收平台事件監聽的回調。
那麼我們還是舉個例子,以Android平台網路變化為例,每當網路變化時就會觸發Android本地的廣播,然後通過EventChannel通知給Flutter組件中,這時候只要我們在Flutter註冊相應的EventChannel就可以實現對網路變化事件的監聽。
下面我們首先看下ManActivity方法中是怎麼做的
在MainActivity中我們做了三件事件:
第一件事,跟上面的一樣,讓用戶可以通過自己去觸發操作判斷當前網路是否可用,當然還是通過MethodChannel來實現的,然後把網路連接的狀態通過我們剛才實現的Toast來彈出來。
當然這件事我們可以不做,只做監聽也是可以的
第二件事,我們構造了一個動態廣播接受者,來處理網路變化的廣播事件,當接收到廣播時判斷網路狀態並返回給Flutter中
第三件事,我們新建了EventChannel對象來對廣播進行註冊於解註冊操作,負責廣播的管理,並且聲明註冊廣播的過濾器ConnectivityManager.CONNECTIVITY_ACTION,意思就是只接受網路狀態變化的廣播。
同樣的我們定義了一個NET_CHANGE_CHANNEL通道。
在Flutter中我們需要註冊對廣播事件的監聽並處理傳來的事件即可。
在Flutter中我們使用了StatefulWidget在構建組件,使得獲取到系統網路變化時可以及時更新界面UI狀態。
具體的流程如下:
首先我們聲明了跟MainActivity中一樣的方法通道和事件通道來調用系統的方法接收系統的廣播回調。
其次,我們完成對方法的註冊於事件廣播的註冊
可以看到
eventChannel.receiveBroadcastStream().listen(_onEvent, onError: _onError)
回調事件我們單獨寫成方法來處理。
最後,當系統廣播觸發時,我們通過事件通過或者方法通道來將事件並更新界面上按鈕的狀態。
我們還是來看下效果:
GIF
小結
我們可以通過MethodChannel來調用系統平台的方法
我們可以使用EventChannel來處理系統平台的監聽或回調
不同平台(Ios、Android)需要單獨的代碼去實現相應的功能
TAG:flutter開發者 |