Flutter与Android通信方式->BasicMessageChannel方式(发送消息并且返回结果)
摘要: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');
static const eventChannel =
EventChannel('plugins.flutter.io/FlutterEventPlugin');
static const _basicMessageChannel = BasicMessageChannel(
'plugins.flutter.io/FlutterBasicMessageChannel', StringCodec());
@override
void initState() {
super.initState();
eventChannel.receiveBroadcastStream().listen(_onEvent, onError: _onError);
// ignore: missing_return
_basicMessageChannel.setMessageHandler((String message) {
LogUtil.e("Flutter收到Android发来Basic消息->, $message");
});
}
void _onEvent(Object event) {
LogUtil.e("Flutter收到Android发来的消息-> " + event.toString());
}
void _onError(Object error) {
LogUtil.e("错误:" + error.toString());
}
@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.BasicMessageChannel
import io.flutter.plugin.common.BasicMessageChannel.MessageHandler
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugin.common.StringCodec
class FlutterBasicMessageChannel : FlutterPlugin, MessageHandler<String> {
private var channelName = "plugins.flutter.io/FlutterBasicMessageChannel"
private var context: Context? = null
companion object {
private var basicMessageChannel: BasicMessageChannel<String>? = null
fun sendContent(content: String) {
basicMessageChannel?.send(content)
}
}
override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) {
basicMessageChannel = BasicMessageChannel(binding.binaryMessenger, channelName, StringCodec.INSTANCE)
basicMessageChannel?.setMessageHandler(this)
context = binding.applicationContext
}
override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
basicMessageChannel?.setMessageHandler(null)
basicMessageChannel = null;
}
override fun onMessage(message: String?, reply: BasicMessageChannel.Reply<String>) {
Log.i("Android", "Received message = $message")
reply.reply("Reply from Android")
}
}
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());
flutterEngine.getPlugins().add(FlutterEventPlugin());
flutterEngine.getPlugins().add(FlutterBasicMessageChannel());
GeneratedPluginRegistrant.registerWith(flutterEngine);
}
}
显示结果:
I/flutter (19721): common_utils e result->处理完成
I/flutter (19721): common_utils e Flutter收到Android发来的消息-> Android发送消息到Flutter
I/flutter (19721): common_utils e Flutter收到Android发来Basic消息->, Android发送Basic消息到Flutter