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

我在网上找了很多例子,很多都没有说到痛点,而且很多都是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 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实现原生交互(带任意参数))