Flutter 调用 Android Native 的方法

1,001 阅读1分钟

Flutter 调用 Android Native 的方法,是通过MethodChannel的方式来实现的:

在Android端:

  • 创建一个Class,实现FlutterPlugin和MethodCallHandler接口
  • 重写onAttachedToEngine(),onDetachedFromEngine(),onMethodCall()
  • onAttachedToEngine()中,根据自定义的CHANNEL_NAME创建MethodChannel, onDetachedFromEngine中,释放MethodChannel
  • onMethodCall中,通过自定义的METHOD_NAME,来响应Flutter中,invokeMethod对Native的通信,代码如下
class MethodChannelPlugin : FlutterPlugin, MethodChannel.MethodCallHandler {

    private var methodChannel: MethodChannel? = null
    private var mNoteForFlutterListener: NoteForFlutterListener? = null

    companion object {
        private const val CHANNEL_NAME = "method_channel"
        private const val METHOD_NAME = "saveNote"
        val instance: MethodChannelPlugin by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
            MethodChannelPlugin()
        }
    }

    override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) {
        methodChannel = MethodChannel(binding.binaryMessenger, CHANNEL_NAME)
        methodChannel?.setMethodCallHandler(this)
    }

    override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
        methodChannel?.setMethodCallHandler(null)
        methodChannel = null
    }

    override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {
        if (call.method == METHOD_NAME) {
            val content = call.argument<String>("content")
            mNoteForFlutterListener?.sendData(content!!)
            result.success("success")
        } else {
            result.notImplemented()
        }
    }

    fun setListener(noteForFlutterListener: NoteForFlutterListener) {
        mNoteForFlutterListener = noteForFlutterListener
    }

在Flutter端:

  • 根据Native中定义的METHOD_NAME来创建MethodChannel
  • 通过MethodChannel.invokeMethod(METHOD_NAME,params),参数METHOD_NAME为Native中定义的METHOD_NAME,params为传递的参数,就可以和Native进行通信了,在Native的onMethodCall方法中,通过call.method == METHOD_NAME来确定,Flutter是否调用的是Native中定义的METHOD_NAME的方法,代码如下
class NoteMainFulState extends State<NoteMainFul> {
  //flutter 和 native 通信
  static const _methodMessageChannel = MethodChannel("method_channel");
  TextField textField;
  TextEditingController textEditingController;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        margin: EdgeInsets.fromLTRB(20.0, 60.0, 20.0, 20.0),
        child: Column(
          children: [
            Container(
              child: Column(
                children: [
                  textField = TextField(
                    //去掉下划线
                    decoration: InputDecoration(border: InputBorder.none),
                    enabled: true,
                    controller: textEditingController = NoteTextEditingController(),
                    keyboardType: TextInputType.multiline,
                    textInputAction: TextInputAction.newline,
                    maxLines: null,
                  ),
                  RichText(
                    text: TextSpan(),
                  ),
                ],
              ),
            ),
            Container(
              color: Colors.deepPurple,
              height: 50,
              child: Row(
                mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                children: [
                  GestureDetector(
                    child: Icon(
                      Icons.forward,
                    ),
                    onTap: clickOut,
                  )
                ],
              ),
            )
          ],
        ),
      ),
    );
  }

  void clickOut() async {
    //调用native方法,返回首页
    var content = textEditingController.text;
    Map<String, dynamic> map = {"content": content};
    var result = await _methodMessageChannel.invokeMethod("saveNote", map);
    print("result  $result");
  }

以上就是Flutter 调用 Android Native 的方法的过程,有时间再分析下他们的实现原理 待续....

附,我当前的Flutter版本是 :
Flutter 1.22.3 • channel stable • github.com/flutter/flu… Framework • revision 8874f21e79 (3 months ago) • 2020-10-29 14:14:35 -0700 Engine • revision a1440ca392 Tools • Dart 2.10.3