目录
本篇通信博客基于flutter_boost
1 Demo地址
注意分支要选flutter_native_message
如果不知道如何混编项目可以看下这篇博客Android Flutter 混编混编成功之后,我们就可以运行这个项目了。
在Native项目的MyApplication.java的onCreate方法注册了一个监听boostLifecycleListener,这个监听很重要,因为双工交互都在这里进行
FlutterBoost.BoostLifecycleListener boostLifecycleListener = new FlutterBoost.BoostLifecycleListener() {
@Override
public void beforeCreateEngine() {
}
@Override
public void onEngineCreated() {
// Android 向 Flutter传递消息在这里
//Flutter 向 Android传递消息也在这里
}
@Override
public void onPluginsRegistered() {
}
@Override
public void onEngineDestroy() {
}
};
2 Android 向 Flutter传递消息——用EventChannel
MyApplication.java
@Override
public void onEngineCreated() {
EventChannel methodChannel2 = new EventChannel(FlutterBoost.instance().engineProvider().getDartExecutor(), "native_flutter_channel");
methodChannel2.setStreamHandler(new EventChannel.StreamHandler() {
@Override
public void onListen(Object arguments, EventChannel.EventSink events) {
//当Flutter成功注册监听器的时候才会回调下面这句话,将msg传给flutter
events.success("msg");
}
@Override
public void onCancel(Object arguments) {
}
});
}
simple_page_widgets.dart
class SecondStatefulRouteWidget extends StatefulWidget {
@override
State<StatefulWidget> createState() {
// TODO: implement createState
return _SecondStatefulRouteWidgetState();
}
}
class _SecondStatefulRouteWidgetState extends State<SecondStatefulRouteWidget> {
static const eventPlugin = const EventChannel('native_flutter_channel');
var _streamSubscription;
@override
void initState() {
super.initState();
_streamSubscription = eventPlugin.receiveBroadcastStream().listen(_onData,
onError: _onError, onDone: _onDone, cancelOnError: true);
}
void _onData(Object event) {
// android传过来的是msg,如果输出的是msg就说明是成功啦
print("_onData_ " + event);
// 接收数据
setState(() {
});
}
void _onError(Object error) {
// 发生错误时被回调
print("_onData_ " + error);
setState(() {
//eventVal = "错误";
});
}
void _onDone() {
//结束时调用
print("_onData_ done" );
}
@override
void dispose() {
super.dispose();
if (_streamSubscription != null) {
_streamSubscription.cancel();
}
}
运行app之后,点击open flutter page,再点击 open second 我们可以看到输入了期待的日志 msg
3 Flutter 向 Android传递消息——用MethodChannel
MyApplication.java
@Override
public void onEngineCreated() {
// 注册MethodChannel,监听flutter侧的getPlatformVersion调用
MethodChannel methodChannel = new MethodChannel(FlutterBoost.instance().engineProvider().getDartExecutor(), "flutter_native_channel");
methodChannel.setMethodCallHandler((call, result) -> {
if (call.method.equals("getPlatformVersion")) {
result.success(Build.VERSION.RELEASE);
} else {
result.notImplemented();
}
});
}
simple_page_widgets.dart中的_FirstRouteWidgetState类
// flutter 侧MethodChannel配置,channel name需要和native侧一致
static const MethodChannel _methodChannel =
MethodChannel('flutter_native_channel');
String _systemVersion = '';
Future<dynamic> _getPlatformVersion() async {
try {
final String result =
await _methodChannel.invokeMethod('getPlatformVersion');
print('getPlatformVersion:' + result);
setState(() {
_systemVersion = result;
});
} on PlatformException catch (e) {
print(e.message);
}
}
....
//如果获取了natvie的数据就显示出来
运行app之后,点击open flutter page,再点击 open first,再点击Get system version by method channel: 这里成功获取到了android的版本