美文网首页
Flutter实现原生交互(带任意参数)

Flutter实现原生交互(带任意参数)

作者: 山上的神仙 | 来源:发表于2019-04-21 14:18 被阅读0次

    我在网上找了很多例子,很多都没有说到痛点,而且很多都是Copy来Copy去的,都是继承自FlutterActivity。
    我这里就为了展示一种不继承FlutterActivity的。

    我只讲关键方法和步骤,其他自行百度一大把

    首先Java代码:

    //通信插件
    MethodChannel channel;
    //标记 这个是与flutter进行通信的标记 也可以理解为频道,自定义 随便写
    private static final String CHANNEL = "samples.flutter.io/battery";
    //启动flutter
    private void startFlutterActivity() {
            //创建flutterview,
            FlutterView flutterView = Flutter.createView(this, getLifecycle(), "r1");
            flutterView.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams
            .MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT));
            center.addView(flutterView);
            channel = new MethodChannel(flutterView,CHANNEL);
            //网上很多都是这一步就没了,这里仅仅是注册了监听的方法,没有说如何传递参数给flutter
            channel.setMethodCallHandler(new MethodChannel.MethodCallHandler() {
                @Override
                public void onMethodCall(MethodCall methodCall, MethodChannel.Result result) {
                         //测试flutter传递过来的信息,仅仅是传递过来!!!result可以做一些事返回给flutter
                        //但是我们想要在外面进行传递就有些麻烦,所还需要实现一个方法 传递!!
                        Log.e("print",methodCall.arguments.toString()+methodCall.method);
                }
            });
      //传递参数给flutter,参数分别为名字,参数,以及回调方法
      private void sendFlutterMsg() {
            channel.invokeMethod("getFlutterName", null, new MethodChannel.Result() {
                @Override
                public void success(@Nullable Object o) {
                    Log.e("debug", "success" + o.toString());
                }
    
                @Override
                public void error(String s, @Nullable String s1, @Nullable Object o) {
                    Log.e("debug", "error" + o.toString());
                }
    
                @Override
                public void notImplemented() {
                    Log.e("debug", "没有实现");
                }
            });
        } 
    

    到这里 java代码基本结束。
    flutter实现代码,有点点多 但是不复杂一样,只是要实现2个,一个监听的,一个发送的:

      //实现插件 以及 参数是对应频道,和原生交互频道代码一致即可!!!
      MethodChannel platform = const MethodChannel("samples.flutter.io/battery");
    
      在initState()里面初始化监听
        @override
      void initState() {
        super.initState();
        platform.setMethodCallHandler(platformCallHandler);
      }
      //实现监听
      Future<dynamic> platformCallHandler(MethodCall call) async {
        switch (call.method) {
          case "getFlutterName":
            setState(() {
              _counter = "Flutter name flutter";
            });
            return "Flutter name flutter";
            break;
        }
    //向原生发送代码 首先是方法名,然后是可变数组作为参数
      void _sendAndroidMsg() {
        platform.invokeMethod("flutter",{"url":"http://www.baidu.com"});
      }
    

    结束了,其中注意的几个点:
    1:通信的频道 也就是 channel 要统一
    2:flutter记得要首先初始化,不然会收不到的

    网上一搜一大把 到处是copy过来的,我也是收集了挺多 最后整理处理这个出来,也方便自己记忆

    相关文章

      网友评论

          本文标题:Flutter实现原生交互(带任意参数)

          本文链接:https://www.haomeiwen.com/subject/kstjgqtx.html