Flutter MethodChannel 學習

Flutter MethodChannel 學習

好久沒寫東西,正好最近有時間又開始研究起來Flutter萧豆,不了解的童鞋可以去查查資料了解一下吞获, 在我看來是目前我了解盜的最理想的跨平臺解決方案了。而跨平臺中一個比較重要的點就是與底層進行交互纠修,本文就主要說一下在Flutter中是如何與Android進行通訊的(iOS應該同理)巾乳。不涉及到源碼您没,只是簡單的使用和在使用過程中的一些想法。

創(chuàng)建初始的Demo

使用 flutter create methodchannellearn 創(chuàng)建一個 flutter 項目胆绊。

導入 services氨鹏,async
import 'dart:async'; import 'package:flutter/services.dart';

首先先在main.dart_MyHomePageState 中創(chuàng)建一個靜態(tài)成員變量methodChannel
static const MethodChannel methodChannel=const MethodChannel("flutter_method_channel");

然后修改原有的_incrementCounter()方法,內(nèi)部調(diào)用methodChannel.invokeMethod()方法压状,調(diào)用Native端的方法仆抵。

void _incrementCounter() { // setState(() { // // This call to setState tells the Flutter framework that something has // // changed in this State, which causes it to rerun the build method below // // so that the display can reflect the updated values. If we changed // // _counter without calling setState(), then the build method would not be // // called again, and so nothing would appear to happen. // _counter++; // }); methodChannel.invokeMethod("_incrementCounter", _counter++); }

接下來就是在Android端添加響應的代碼
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); GeneratedPluginRegistrant.registerWith(this); new MethodChannel(getFlutterView(), "flutter_method_channel").setMethodCallHandler( new MethodChannel.MethodCallHandler() { @Override public void onMethodCall(MethodCall methodCall, MethodChannel.Result result) { if (methodCall.method.equals("_incrementCounter")) { toast(methodCall.arguments); } } }); }

跑一下之后可以看到正常的toast彈出。

添加回調(diào)

onMethodCall中我們可以看到還有另外的一個參數(shù)result种冬,可以使用它將數(shù)據(jù)傳遞回Flutter中镣丑。

修改Android端代碼

if (methodCall.method.equals("_incrementCounter")) { if(methodCall.arguments instanceof Integer){ int count= (int) methodCall.arguments; count++; result.success(count); } }

同時修改Flutter中的代碼

Future<Null> _incrementCounter() async { // setState(() { // // This call to setState tells the Flutter framework that something has // // changed in this State, which causes it to rerun the build method below // // so that the display can reflect the updated values. If we changed // // _counter without calling setState(), then the build method would not be // // called again, and so nothing would appear to happen. // _counter++; // }); var result = await methodChannel.invokeMethod("_incrementCounter", _counter); setState(() { _counter = result; }); }

運行一下,點擊次數(shù)正常增加娱两。

主動通知Flutter

有時候我們可能會需要主動的通知flutter ,而不是等待flutter調(diào)用莺匠,利用回調(diào)傳遞數(shù)據(jù),這是就需要一個新的Channel, EventChannel

同樣還是剛才的例子十兢,這會先修改flutter代碼趣竣,使用EventChannel

static const EventChannel eventChannel = const EventChannel("flutter_event_channel"); void _onData(event) { setState(() { _counter = event; }); } @override void initState() { // TODO: implement initState super.initState(); eventChannel.receiveBroadcastStream().listen(_onData); }

然后修改Android的代碼

new MethodChannel(getFlutterView(), "flutter_method_channel").setMethodCallHandler( new MethodChannel.MethodCallHandler() { @Override public void onMethodCall(MethodCall methodCall, MethodChannel.Result result) { if (methodCall.method.equals("_incrementCounter")) { if (methodCall.arguments instanceof Integer) { int count = (int) methodCall.arguments; count++; if (eventSink != null) { eventSink.success(count); } } } } }); new EventChannel(getFlutterView(), "flutter_event_channel").setStreamHandler( new EventChannel.StreamHandler() { @Override public void onListen(Object o, EventChannel.EventSink eventSink) { MainActivity.this.eventSink = eventSink; } @Override public void onCancel(Object o) { MainActivity.this.eventSink = null; } });

同樣 運行摇庙,數(shù)據(jù)也能夠正常顯示

這里EventChannel的使用場景應該會有好多,畢竟一個持久長時間的消息通道在實際場景中會有很多應用遥缕。

項目的代碼地址在這里

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末卫袒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子单匣,更是在濱河造成了極大的恐慌夕凝,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件户秤,死亡現(xiàn)場離奇詭異码秉,居然都是意外死亡,警方通過查閱死者的電腦和手機虎忌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門泡徙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人膜蠢,你說我怎么就攤上這事±蚶迹” “怎么了挑围?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長糖荒。 經(jīng)常有香客問我杉辙,道長,這世上最難降的妖魔是什么捶朵? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任蜘矢,我火速辦了婚禮,結果婚禮上综看,老公的妹妹穿的比我還像新娘品腹。我一直安慰自己,他們只是感情好红碑,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布舞吭。 她就那樣靜靜地躺著,像睡著了一般析珊。 火紅的嫁衣襯著肌膚如雪羡鸥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天忠寻,我揣著相機與錄音惧浴,去河邊找鬼。 笑死奕剃,一個胖子當著我的面吹牛衷旅,可吹牛的內(nèi)容都是我干的捐腿。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼芜茵,長吁一口氣:“原來是場噩夢啊……” “哼叙量!你這毒婦竟也來了?” 一聲冷哼從身側響起九串,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤绞佩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后猪钮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體品山,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年烤低,在試婚紗的時候發(fā)現(xiàn)自己被綠了肘交。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡扑馁,死狀恐怖涯呻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情腻要,我是刑警寧澤复罐,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站雄家,受9級特大地震影響效诅,放射性物質發(fā)生泄漏。R本人自食惡果不足惜趟济,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一乱投、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧顷编,春花似錦戚炫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至层宫,卻和暖如春杨伙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背萌腿。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工限匣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓米死,卻偏偏與公主長得像锌历,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子峦筒,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi閱讀 7,292評論 0 10
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理究西,服務發(fā)現(xiàn),斷路器物喷,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 有很長一段時間卤材,電影和各種演出淡出了我的世界,在居住的小鎮(zhèn)峦失,電影院已經(jīng)關閉扇丛。直到孩子大了一點,直到我們有了車尉辑,我們...
    薇薇安的30天閱讀 696評論 0 0
  • 20年前帆精,我參加了【戰(zhàn)神之道】,至今回憶隧魄,依然如當年的動情卓练! 這場戰(zhàn)爭,預言了我的人生购啄!記得在硝煙彌漫的空曠里...
    安清King閱讀 622評論 0 0
  • 2018.3.17 星期六 天氣:雨 事出有因(原創(chuàng)) 今天去市一中參加中招備考會昆庇,遇到了在兄弟...
    你健康我快樂_61fc閱讀 192評論 0 3