目錄
本篇通信博客基於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的版本