其他分享
首页 > 其他分享> > 原生与Flutter通信

原生与Flutter通信

作者:互联网

 

之前讲过一篇Flutter与原生通信,为大家讲解了Flutter如何调用原生,但是没有介绍原生如何调用Flutter,那么原生如何调用Flutter呢?

诶~,还是通过MethodChannel,只不过这次它俩角色互换了一下,之前是原生作为通信方法的提供方,Flutter为调用方,现在倒过来了,Flutter作为通信方法的提供方,原生作为调用方。是不是很有意思。

Flutter端(提供方)

和在原生中一样,通过MethodChannel的setMethodCallHandler方法进行注册,提供原生调用的通信方法。需要实现一个参数为MethodCall,返回值为Future对象的函数。

void setMethodCallHandler(Future<dynamic> Function(MethodCall call)? handler) {
    _methodChannelHandlers[this] = handler;
    binaryMessenger.setMessageHandler(
      name,
      handler == null
        ? null
        : (ByteData? message) => _handleAsMethodCall(message, handler),
    );
  }

MethodCall

MethodCall应该不陌生吧,在上一篇博客了我们见过它了,但是Flutter中的MethodCall和原生中的MethodCall还有点不一样,Flutter中的MethodCall只有属性,没有方法。

我们在flutter中注册一个’lal‘方法,将原生传递过来的参数编成一段话返回给原生。

 static const nativeChannel =
      const MethodChannel("com.fengwo.reading.flutter_app/native");
 //对方法进行注册
 nativeChannel.setMethodCallHandler((call) {
      if(call.method == "lal") {
        return Future.value("Hello~ ${call.arguments}\nI'm flutter");
      }
      return null;
    });

原生端(调用方)

原生中调用flutter,同样通过MethodChannel的invokeMethod方法,其有三个参数,第一个是flutter中定义的方法名称,第二个是要传递的参数,第三个是调用flutter方法结果的回调接口。

  @UiThread
  public void invokeMethod(String method, @Nullable Object arguments, @Nullable Result callback) {
    messenger.send(
        name,
        codec.encodeMethodCall(new MethodCall(method, arguments)),
        callback == null ? null : new IncomingResultHandler(callback));
  }

现在,我们使用原生调用flutter中的'lal'方法,传递参数字符串‘android’,将flutter返回的结果通过toast打印出来。

class SecondActivity : FlutterActivity() {

    lateinit var channel: MethodChannel

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL_NATIVE)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)
        btn.setOnClickListener {
            channel.invokeMethod("lal", "android", object : MethodChannel.Result {
                override fun notImplemented() {
                    Toast.makeText(this@SecondActivity, "notImplemented", Toast.LENGTH_SHORT).show()
                }

                override fun error(errorCode: String?, errorMessage: String?, errorDetails: Any?) {
                    Toast.makeText(this@SecondActivity, "error:$errorMessage", Toast.LENGTH_SHORT).show()
                }

                override fun success(result: Any?) {
                    if (result != null)
                        Toast.makeText(this@SecondActivity, result as String, Toast.LENGTH_SHORT).show()
                }

            })
        }
    }
}

演示

 

 

标签:原生,调用,Flutter,通信,MethodCall,MethodChannel,flutter
来源: https://blog.csdn.net/Ever69/article/details/117881401