Flutter 和原生APP进行交互

在混合开发中,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