Flutter与Android通信方式->EventChannel方式(单项通信,不返回结果)
摘要: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');
@override
void initState() {
super.initState();
eventChannel.receiveBroadcastStream().listen(_onEvent, onError: _onError);
}
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.EventChannel
class FlutterEventPlugin : FlutterPlugin, EventChannel.StreamHandler {
private var channelName = "plugins.flutter.io/FlutterEventPlugin";
companion object {
private var eventChannel: EventChannel? = null
private var eventSink: EventChannel.EventSink? = null
private var context: Context? = null
fun sendContent(content:String) {
eventSink?.success(content);
}
}
override fun onListen(arguments: Any?, events: EventChannel.EventSink?) {
eventSink = events
}
override fun onCancel(arguments: Any?) {
eventSink = null
}
override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) {
eventChannel = EventChannel(binding.binaryMessenger, channelName)
eventChannel!!.setStreamHandler(this)
context = binding.applicationContext
}
override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
eventChannel = null
eventChannel!!.setStreamHandler(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());
flutterEngine.getPlugins().add(FlutterEventPlugin());
GeneratedPluginRegistrant.registerWith(flutterEngine);
}
}
显示结果:
I/flutter (19362): common_utils e 初始化完成->plugins.flutter.io/FlutterEventPlugin
I/flutter (19362): common_utils e result->处理完成
I/flutter (19362): common_utils e Flutter收到Android发来的消息-> Android发送消息到Flutter