Flutter與Native交互的方式

Flutter與Native交換主要是使用PlatformChannel功能

PlatformChannel

Platformchannle分為三種類型

  • BasicMessageChannel
  • MethodChannel
  • EventChannel

BasicMessageChannel

用于傳遞數(shù)據(jù)。Flutter與原生項目的資源是不共享的,可以通過BasicMessageChannel 來獲取Native項目的圖標(biāo)等資源

MethodChannel

傳遞方法調(diào)用。Flutter主動調(diào)用Native的方法,并獲取相應(yīng)的返回值。比如獲取系統(tǒng)電量,發(fā)起Toast等系統(tǒng)API,可以通過這個完成。

EventChannel

傳遞事件。Native將時間通知到Flutter。比如Flutter需要監(jiān)聽網(wǎng)絡(luò)情況。EventChannel可以將Flutter的一個監(jiān)聽器交給Native,Native去做網(wǎng)絡(luò)廣播的監(jiān)聽,當(dāng)收到廣播之后借助 EventChannel調(diào)用Flutter注冊的監(jiān)聽,完成對Flutter的事件通知。

具體實現(xiàn)

BasicMessageChannel

  • Flutter

    static const messageChannel = const BasicMessageChannel('samples.flutter.io/message', StandardMessageCodec());
    
    static const messageChannel2 = const BasicMessageChannel('smaples.flutter.io/message2', StandardMessageCodec());
    
    Future<String> sendMessage() async {
        String reply = await messageChannel.send('發(fā)送給Native的數(shù)據(jù)');
        print('reply: $reply');
        return reply;
    }
    
    void receiveMessage() {
        messageChannel2.setMessageHandler((message) async {
           print('message : $message');
            return '從Native端返回來的數(shù)據(jù)';
        });
    }
    
    @Override
    void initState() {
        super.initState();
        receiveMessage();
        sendMessage();
    }
    
  • iOS 先不動

  • Android

    BasicMessageChanngl messageChannel = new BasicMessageChannel<Object>(getFlutterView(), "samples.flutter.io/message2", StandardMessageCodes.INSTANCE);
    
    // 接收來自Flutter的消息
    messageChannel.setMessageHandler(new BasicMessageChannel.MessageHandler<Object>() {
        @Override
        public void onMessage(object o, BasicMessageChannel.Reply<Object> reply) {
            Log.d("jimbray", "OnMessage" + o);
            reply.reply("返回給Flutter的數(shù)據(jù)");
        }
    });
    
    // 發(fā)送數(shù)據(jù)給Flutter
    BasicMessageChannel messageChannel2 = new BasicMessageChannel<Object>(
    getFlutterView(), "samples.flutter.io/message2", StandardMessageCodec.INSTANCE);
    
    // 發(fā)送消息到Flutter
    messageChannel2.send("發(fā)送到Flutter的消息", new BasicMessageChannel.Reply<Object>() {
       @Override
        public void reply(Object o) {
            Log.d("jimbray", "onReply: " + o);
        }
    });
    

MethodChannel

  • Flutter

    static const platform = const MethodChannel('samples.flutter.io/battery');
    
    Future<Null> _getBatteryLevel() async {
        String batteryLevel;
        try {
          final int result = awai platform.invokeMethod('getBatteryLevel');
          batteryLevel = 'BatteryLevel at $result %';
        } on PlatformException catch(e) {
            batterylevel = 'Failed to get battery levet: "${e.message}".';
        }
        
        setState(() {
            _batteryLevel = batterLevel;
        });
    }
    
  • iOS先不動

  • Android

    new MethodChannel(getFlutterView(), "samples.flutter.io/battery").setMethodCallHandler(new MethodCallHandler() {
        @Override
        public void onMethodCall(MethodCall call, Result result) {
            if (call.method.equals("getBatteryLevel")) {
                int batteryLevel = _getBatteryLevel();
                
                if (batteryLevel != -1) {
                    result.success(batteryLevel);
                } else {
                    result.error("UNAVAILABLE", "Battery level is not available.", null);
                }
            } else {
                result.notImplemented();
            }
        }
    });
    
    private int getBatterylevel() {
        // 實現(xiàn)Android平臺的 getBatteryLevel 代碼即可
    }
    

EventChannel

  • Flutter

    static const EventChannel _eventChannel = const EventChannel('samples.flutter.io/test');
    
    void _onEvent(Object event) {
        print('從Native發(fā)送過來的消息內(nèi)容: $event');
    }
    
    void _onError(Object error) {
        print('從Native發(fā)送過來的錯誤');
    }
    
    @Override
    void initState() {
        super.initState();
        _eventChannel.receiveBroadcastStream().listen(_onEvent, onError: _onError);
    }
    
  • iOS先不動

  • Android

    new EventChannel(getFlutterView(), "samples.flutter.io/test").setStreanHandler(
    new EventChannel.StreamHandler() {
        @Override
        public void onListen(Object o, EventChannel.EventSink eventSink) {
            this.eventSink = eventSink;
        }
        
        @Override
        public void onCancel(Object o) {
            
        }
        
        
    });
    
    private EventChannel.EventSink eventSink;
    private int count = 0;
    
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage();
            eventSink.success((count++) + "主動發(fā)送消息到Flutter");
        }
    }
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 本文主要介紹 Flutter 與 Android 的混合開發(fā),關(guān)于 Flutter 與 iOS 的混合開發(fā)后...
    南小夕閱讀 2,260評論 1 10
  • Flutter MethodChannel 學(xué)習(xí) 好久沒寫東西,正好最近有時間又開始研究起來Flutter,不了解...
    one_cup閱讀 5,512評論 0 2
  • Flutter & Native 混合開發(fā) 項目集成方案 問題 項目中仍有大量業(yè)務(wù)使用 Native 開發(fā)。項目引...
    AiLearn閱讀 2,262評論 0 3
  • Flutter作為一種跨平臺解決方案,經(jīng)常會作為一個模塊嵌入到原生Android與iOS應(yīng)用中,F(xiàn)lutter與A...
    Android高級開發(fā)閱讀 2,313評論 0 13
  • 許多,回憶定格的瞬間,幸福滿滿,轉(zhuǎn)念一想,卻也帶著惋惜。又或許!回憶這東西,根本沒有定格這瞬間。所以好像很多事情,...
    purple小姐閱讀 326評論 0 2

友情鏈接更多精彩內(nèi)容