Flutter與原生交互總結(jié)

Flutter學(xué)習(xí)訣竅朱巨,F(xiàn)lutter一切皆組件澄耍!

Android與Flutter之間的通信共有四種實(shí)現(xiàn)方式奢米。

  1. 由于在初始化flutter頁(yè)面時(shí)會(huì)傳遞一個(gè)字符串——route油湖,因此我們就可以拿route來(lái)做文章检激,傳遞自己想要傳遞的數(shù)據(jù)肴捉。該種方式僅支持單向數(shù)據(jù)傳遞且數(shù)據(jù)類(lèi)型只能為字符串,無(wú)返回值叔收。
  2. 通過(guò)EventChannel來(lái)實(shí)現(xiàn)齿穗,EventChannel僅支持?jǐn)?shù)據(jù)單向傳遞,無(wú)返回值饺律。
  3. 通過(guò)MethodChannel來(lái)實(shí)現(xiàn)窃页,MethodChannel支持?jǐn)?shù)據(jù)雙向傳遞,有返回值复濒。
  4. 通過(guò)BasicMessageChannel來(lái)實(shí)現(xiàn)脖卖,BasicMessageChannel支持?jǐn)?shù)據(jù)雙向傳遞,有返回值巧颈。

一畦木、先看下初始化的方式

FlutterView flutterView = Flutter.createView(this, getLifecycle(), "route");

route就是默認(rèn)的路由字段,這個(gè)字段可以是一個(gè)JSON對(duì)象砸泛,這樣就可以實(shí)現(xiàn)原生傳遞給Flutter數(shù)據(jù)十籍,F(xiàn)lutter在自己的路由中心解析這個(gè)JSON對(duì)象蛆封,獲取到需要的數(shù)據(jù)進(jìn)行處理,初始化頁(yè)面就ok了勾栗。

二惨篱、EventChannel

原生傳遞給Flutter數(shù)據(jù),這個(gè)方式可以避免一中的在路由里面處理數(shù)據(jù)围俘,Android代碼如下:

     new EventChannel(flutterView, CHANNEL_POST).setStreamHandler(new EventChannel.StreamHandler() {
            @Override
            public void onListen(Object o, EventChannel.EventSink eventSink) {
                eventSink.success("原生傳遞參數(shù)");
            }

            @Override
            public void onCancel(Object o) {

            }
        });

其中的CHANNEL_POST妒蛇,是自己定義的一個(gè)協(xié)議,和Flutter側(cè)統(tǒng)一就可以楷拳,在main.dart中注冊(cè)該方法就可以绣夺,示例代碼如下:

  Application.eventChannel = const EventChannel(TTKeys.channel_native_post);

參數(shù)的獲取在路由到的頁(yè)面中實(shí)現(xiàn),如下所示:

  String naviTitle = '商品詳情';
  // 回調(diào)事件
  void _onEvent(Object event) {
    setState(() {
      naviTitle = event.toString();
    });
  }
  // 錯(cuò)誤返回
  void _onError(Object error) {

  }

三欢揖、MethodChannel

該方式可以實(shí)現(xiàn)雙向通道陶耍,F(xiàn)lutter調(diào)用原生,原生再返回?cái)?shù)據(jù)給Flutter她混,注冊(cè)的方式和EventChannel類(lèi)似烈钞,Android端的代碼如下:

      MethodChannel channelGet = new MethodChannel(flutterView, CHANNEL_GET);

        channelGet.setMethodCallHandler((call, result) -> {
            result.success(authHeader());
            switch (call.method) {
                case "router":
                    String args = (String) call.arguments;
                    result.success("回傳給Flutter的參數(shù)");
                    break;
                default:
                    break;
            }
        });

Flutter端使用一下的方法獲取Android回傳的數(shù)據(jù):

Application.methodChannel.invokeMethod("router")

這里的路由字段可以自由定義,能區(qū)分開(kāi)就好坤按。

四毯欣、BasicMessageChannel

BasicMessageChannel是一種能夠在native與flutter之間互相發(fā)送消息的通信方式,它支持?jǐn)?shù)據(jù)類(lèi)型最多臭脓,使用范圍最廣酗钞。EventChannel與MethodChannel的應(yīng)用場(chǎng)景可以使用BasicMessageChannel來(lái)實(shí)現(xiàn),但BasicMessageChannel的應(yīng)用場(chǎng)景就不一定能夠使用EventChannel與MethodChannel來(lái)實(shí)現(xiàn)来累。該方式有返回值砚作。
Android端代碼如下:

public class BasicMessageChannelPlugin implements BasicMessageChannel.MessageHandler<String> {

    private Activity activity;

    private BasicMessageChannel<String> messageChannel;

    static BasicMessageChannelPlugin registerWith(FlutterView flutterView) {
        return new BasicMessageChannelPlugin(flutterView);
    }

    private BasicMessageChannelPlugin(FlutterView flutterView) {
        this.activity = (Activity) flutterView.getContext();
        this.messageChannel = new BasicMessageChannel<String>(flutterView, "BasicMessageChannelPlugin", StringCodec.INSTANCE);
        messageChannel.setMessageHandler(this);
    }


    @Override
    public void onMessage(String s, BasicMessageChannel.Reply<String> reply) {
        reply.reply("BasicMessageChannelPlugin收到:" + s);
        if (activity instanceof FlutterAppActivity) {
            ((FlutterAppActivity) activity).showContent(s);
        }
    }

    void send(String str, BasicMessageChannel.Reply<String> reply) {
        messageChannel.send(str, reply);
    }
}

Flutter端的代碼如下:

class _MyHomePageState extends State<MyHomePage> {
  //StringCodec()為編碼格式
  BasicMessageChannel<String> _basicMessageChannel =
      BasicMessageChannel("BasicMessageChannelPlugin", StringCodec());


  @override
  void initState() {
    _basicMessageChannel.setMessageHandler((message) => Future<String>(() {
          print(message);
          //message為native傳遞的數(shù)據(jù)
          setState(() {
            _content = message;
          });
          //給Android端的返回值
          return "收到Native消息:" + message;
        }));
    _controller = TextEditingController();
    super.initState();
  }

  //向native發(fā)送消息
  void _sendToNative() {
      Future<String> future = _basicMessageChannel.send(_controller.text);
      future.then((message) {
        _resultContent = "返回值:" + message;
      });
  }

  @override
  Widget build(BuildContext context) {...}
}

原生與Flutter數(shù)據(jù)交互,主要就是構(gòu)建好通道機(jī)制嘹锁,可以多嘗試不同的數(shù)據(jù)傳遞葫录,構(gòu)建拓展性比較高的路由中心。感謝閱讀~

如有疑問(wèn)可加好友探討


作者微信
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末领猾,一起剝皮案震驚了整個(gè)濱河市米同,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌摔竿,老刑警劉巖面粮,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異拯坟,居然都是意外死亡但金,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)郁季,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)冷溃,“玉大人,你說(shuō)我怎么就攤上這事梦裂∷普恚” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵年柠,是天一觀的道長(zhǎng)凿歼。 經(jīng)常有香客問(wèn)我,道長(zhǎng)冗恨,這世上最難降的妖魔是什么答憔? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮掀抹,結(jié)果婚禮上虐拓,老公的妹妹穿的比我還像新娘。我一直安慰自己傲武,他們只是感情好蓉驹,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著揪利,像睡著了一般态兴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上疟位,一...
    開(kāi)封第一講書(shū)人閱讀 49,071評(píng)論 1 285
  • 那天瞻润,我揣著相機(jī)與錄音,去河邊找鬼甜刻。 笑死敢订,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的罢吃。 我是一名探鬼主播楚午,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼尿招!你這毒婦竟也來(lái)了矾柜?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤就谜,失蹤者是張志新(化名)和其女友劉穎怪蔑,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體丧荐,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缆瓣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了虹统。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弓坞。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡隧甚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出渡冻,到底是詐尸還是另有隱情戚扳,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布族吻,位于F島的核電站帽借,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏超歌。R本人自食惡果不足惜砍艾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望巍举。 院中可真熱鬧脆荷,春花似錦、人聲如沸禀综。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)定枷。三九已至孤澎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間欠窒,已是汗流浹背覆旭。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留岖妄,地道東北人型将。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像荐虐,于是被迫代替她去往敵國(guó)和親七兜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345