基于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的版本

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