Flutter与Android通信方式->MethodChannel方式(发送消息并且返回结果)

☆樱花仙子☆ 提交于 2020-10-06 10:29:21

摘要:Flutter版本号:1.12.13,Kotlin版本号:1.3.72 

版本号不同,实现的方式不一样,所以特此标注下。

具体的实现原理,自行查阅。这里只写代码实现过程,主要原因是网上Kotlin的实现方式实在太少,特此记录。

Flutter:

import 'package:base_library/base_library.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

class ChannelDemoPage extends StatefulWidget {
  @override
  _ChannelDemoPageState createState() => _ChannelDemoPageState();
}

class _ChannelDemoPageState extends State<ChannelDemoPage> {

  static const _channel =
      const MethodChannel('plugins.flutter.io/FlutterMessagePlugin');

  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      body: new Row(

      ),
      floatingActionButtonLocation: FloatingActionButtonLocation.endFloat,
      floatingActionButton: new FloatingActionButton(
        backgroundColor: Colors.blueAccent,
        onPressed: () {
          this.getResult();
        },
        child: new Icon(Icons.adb),
      ),
    );
  }

  void getResult() async {
    try {
      Map<String, Object> map = {"shareUrl": "https://www.baidu.com"};
      var result = await _channel.invokeMethod("getRealUrl", map);
      LogUtil.e("result->$result");
    } catch (e) {
      LogUtil.e("e->, $e");
    }
  }
}

Kotlin:

import android.content.Context
import android.util.Log
import io.flutter.embedding.engine.plugins.FlutterPlugin
import io.flutter.plugin.common.*
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
import io.flutter.plugin.common.MethodChannel.Result


class FlutterMessagePlugin : FlutterPlugin, MethodCallHandler {

    private var channel: MethodChannel? = null

    private var context: Context? = null

    override fun onMethodCall(call: MethodCall, result: Result) {
        if (call.method == "getRealUrl") {
            var shareUrl = call.argument<String>("shareUrl");
            Log.v("shareUrl=", shareUrl)
            result.success("处理完成")
        } else {
            result.notImplemented()
        }
    }

    companion object {
        var channelName = "plugins.flutter.io/FlutterMessagePlugin";
        fun registerWith(registry: PluginRegistry.Registrar) {
            var flutterPlugin = FlutterMessagePlugin();
            flutterPlugin.channel = MethodChannel(registry.messenger(), channelName);
            flutterPlugin.context = registry.context();
            flutterPlugin.channel?.setMethodCallHandler(flutterPlugin);
        }
    }

    override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) {
        channel = MethodChannel(binding.binaryMessenger, channelName)
        context = binding.applicationContext
        channel!!.setMethodCallHandler(this)
    }

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



import androidx.annotation.NonNull;
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.GeneratedPluginRegistrant

class MainActivity: FlutterActivity () {

        override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        flutterEngine.getPlugins().add(FlutterMessagePlugin());
        
        GeneratedPluginRegistrant.registerWith(flutterEngine);
    }

}

显示结果:

V/shareUrl=: https://www.baidu.com
I/flutter: common_utils e  result->处理完成

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!