基於flutter_boost實現Native Flutter通信

目錄

本篇通信博客基於flutter_boost

 

1 Demo地址

Demo git地址

注意分支要選flutter_native_message

image

如果不知道如何混編項目可以看下這篇博客Android Flutter 混編混編成功之後,我們就可以運行這個項目了。

在Native項目的MyApplication.java的onCreate方法註冊了一個監聽boostLifecycleListener,這個監聽很重要,因爲雙工交互都在這裏進行

 FlutterBoost.BoostLifecycleListener boostLifecycleListener = new FlutterBoost.BoostLifecycleListener() {

            @Override
            public void beforeCreateEngine() {

            }

            @Override
            public void onEngineCreated() {
                 // Android 向 Flutter傳遞消息在這裏
                 //Flutter 向 Android傳遞消息也在這裏
        
            }

            @Override
            public void onPluginsRegistered() {

            }

            @Override
            public void onEngineDestroy() {

            }

        };

2 Android 向 Flutter傳遞消息——用EventChannel

MyApplication.java

            @Override
            public void onEngineCreated() {
                EventChannel methodChannel2 = new EventChannel(FlutterBoost.instance().engineProvider().getDartExecutor(), "native_flutter_channel");
                methodChannel2.setStreamHandler(new EventChannel.StreamHandler() {
                    @Override
                    public void onListen(Object arguments, EventChannel.EventSink events) {
                //當Flutter成功註冊監聽器的時候纔會回調下面這句話,將msg傳給flutter
                        events.success("msg");
                    }

                    @Override
                    public void onCancel(Object arguments) {
                    }
                });

            }
            

simple_page_widgets.dart

class SecondStatefulRouteWidget extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return _SecondStatefulRouteWidgetState();
  }
}

class _SecondStatefulRouteWidgetState extends State<SecondStatefulRouteWidget> {
  static const eventPlugin = const EventChannel('native_flutter_channel');
  var _streamSubscription;

  @override
  void initState() {
    super.initState();
    _streamSubscription = eventPlugin.receiveBroadcastStream().listen(_onData,
        onError: _onError, onDone: _onDone, cancelOnError: true);
  }

  void _onData(Object event) {
  // android傳過來的是msg,如果輸出的是msg就說明是成功啦
    print("_onData_ " + event);
    // 接收數據
    setState(() {

    });
  }

  void _onError(Object error) {
    // 發生錯誤時被回調
    print("_onData_ " + error);
    setState(() {
      //eventVal = "錯誤";
    });
  }

  void _onDone() {
    //結束時調用
    print("_onData_ done" );
  }

  @override
  void dispose() {
    super.dispose();
    if (_streamSubscription != null) {
      _streamSubscription.cancel();
    }
  }

運行app之後,點擊open flutter page,再點擊 open second imageimage 我們可以看到輸入了期待的日誌 msg image

3 Flutter 向 Android傳遞消息——用MethodChannel

MyApplication.java

            @Override
            public void onEngineCreated() {
                // 註冊MethodChannel,監聽flutter側的getPlatformVersion調用
                MethodChannel methodChannel = new MethodChannel(FlutterBoost.instance().engineProvider().getDartExecutor(), "flutter_native_channel");
                methodChannel.setMethodCallHandler((call, result) -> {

                    if (call.method.equals("getPlatformVersion")) {
                        result.success(Build.VERSION.RELEASE);
                    } else {
                        result.notImplemented();
                    }

                });

            }
            

simple_page_widgets.dart中的_FirstRouteWidgetState類

// flutter 側MethodChannel配置,channel name需要和native側一致
  static const MethodChannel _methodChannel =
      MethodChannel('flutter_native_channel');
  String _systemVersion = '';

  Future<dynamic> _getPlatformVersion() async {
    try {
      final String result =
          await _methodChannel.invokeMethod('getPlatformVersion');
      print('getPlatformVersion:' + result);
      setState(() {
        _systemVersion = result;
      });
    } on PlatformException catch (e) {
      print(e.message);
    }
  }
  
  ....
  //如果獲取了natvie的數據就顯示出來

運行app之後,點擊open flutter page,再點擊 open first,再點擊Get system version by method channel: image 這裏成功獲取到了android的版本

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章