native和flutter双向通信

2,269 阅读1分钟

这里以Android为例,ios类似。
1、flutter调用Android方法: 首先建立连接: 在Android原生代码中添加

// 建立连接的凭证
public static String CHANNEL_MESSAGE = "channel/method";
// 建立连接的类
private MethodChannel methodChannel;
// flutter的view。这里以view的方式添加到Android原生项目
View flutterView = Flutter.createView(
        LeapStarActivity.this,
        getLifecycle(),
        param
);
methodChannel = new MethodChannel((BinaryMessenger) flutterView, CHANNEL_MESSAGE);
// 这里是接收flutter调用Android方法地方
methodChannel.setMethodCallHandler((methodCall, result) -> {
    if (methodCall != null && methodCall.method != null) {
        switch (methodCall.method) {
            case "onBackPressed":
                break;
            case "test":
                break;
            default:
                break;
        }
    }
});

在flutter中添加:

// 必须和Android中的相同
static const CHANNEL_METHOD = 'channel/method';
static const platform = const MethodChannel(CHANNEL_METHOD);
// 调用onBackPressed方法
await platform.invokeMethod('onBackPressed');
// 调用test方法
await platform.invokeMethod('test');

2、在Android中调用flutter
基于以上CHANNEL_METHOD和platform不变 在flutter中添加被调用的方法

  Future<dynamic> platformCallHandler(MethodCall call) async{
    if(call!=null && call.method!=null){
      switch(call.method){
        case "test":
          return "ok";
          break;
      }
    }
  }
  // 在需要的地方初始化
  _testChannel(){
    Config.platform.setMethodCallHandler(platformCallHandler);
  }

在Android中添加调用

methodChannel.invokeMethod("test", null, new MethodChannel.Result() 
{
  @Override
  public void success(@Nullable Object o) {
      LogUtils.d(TAG,"fcs-success");
  }

  @Override
  public void error(String s, @Nullable String s1, @Nullable Object o) {
      LogUtils.d(TAG,"fcs-error");
  }

  @Override
  public void notImplemented() {
      LogUtils.d(TAG,"fcs-notImplemented");
  }
});