在混合开发中,flutter避免不掉的需要和我们原生的Android代码进行交互,例如获取设备电量,或者使用APP已有的功能代码。
本文记录 flutter 和 Android 进行交互的过程!
创建工程 pluginmy
flutter create -t plugin -a java --org com.example pluginmy
1. Flutter调用Java代码( MethodChannel)
1.1 java部分代码编写
在Java端,首先通过studio 单独打开Android项目 ,然后在 MainActivity中注入MethodChannel
这里的 CHANNEL 需要和我们dart使用的协议保持一致
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| MethodChannel methodChannel = new MethodChannel(getFlutterView(), CHANNEL);
methodChannel.setMethodCallHandler( (call, result) -> { // 在这个回调里处理从Flutter来的调用 if (call.method.equals("getResult")) {
String batteryLevel = " 这是从Android端返回的结果~ ";
result.success(batteryLevel);
new Handler().postDelayed(new Runnable() { @Override public void run() { methodChannel.invokeMethod("a" , "times = " + times); } },1000);
} else { result.notImplemented(); } });
|
1.2 dart部分进行调用
如下代码,我们完成了 通过 协议名为 【pluginmy】 调用方法名为 【getPlatformVersion】的功能
只需要在需要的时机,调用 platformVersion方法即可!!!
1 2 3 4 5 6 7 8 9 10
| class Pluginmy { static const MethodChannel _channel = const MethodChannel('pluginmy');
static Future<String> get platformVersion async { final String version = await _channel.invokeMethod('getPlatformVersion'); return version; } }
|
在dart中对methodChannel也可以进行被动接收 . 通过这种方式,可以接收对应的MethodChannel 在 native端进行的方法调用
1 2 3 4 5 6 7 8 9 10 11
| @override void initState() {
super.initState(); platform.setMethodCallHandler((handler) { setState(() { // _callback = handler.arguments; }); });
}
|
1.3 java调用dart代码
参考上一步,第15行代码
2. Flutter 接收Java代码回调(EventChannel)
2.1 dart部分进行注册监听
1. 首先创建 EventChannel
1
| static const EventChannel eventChannel = EventChannel("Event_Channel");
|
2. state init 时机注册接收流
1 2 3 4 5 6 7 8 9 10 11 12 13
| eventChannel.receiveBroadcastStream().listen(_onEnvent,onError: _onError)
//接收activity传递来的参数obj void _onEnvent(Object obj){ // Fluttertoast.showToast(msg: "from android"); setState(() { _callback = obj; }); } void _onError(Object obj){ }
|
2.2 Java部分事件派发给dart
在mainActivity中创建 EventChannel
1 2 3 4 5 6 7 8 9 10 11 12 13
| EventChannel eventChannel = new EventChannel(getFlutterView(), "Event_Channel"); eventChannel.setStreamHandler(new EventChannel.StreamHandler() { @Override public void onListen(Object o, EventChannel.EventSink eventSink) { sink = eventSink; eventSink.success("times = sss "); }
@Override public void onCancel(Object o) {
} });
|
Flutter中和原生的交互有主动调用和被动接收2种,分别应用于不同的场景中。
MethodChannel提供给dart端进行主动调用,并且可以异步等待此methodChannel返回值。
EventChannel类似于注册一个回调给原生代码,当原生有变动就可以主动广播到我们的dart端。
参考文档:
https://www.yuque.com/xytech/flutter/fu7h25