Flutter與Native交換主要是使用PlatformChannel功能
PlatformChannel
Platformchannle分為三種類型
- BasicMessageChannel
- MethodChannel
- EventChannel
BasicMessageChannel
用于傳遞數(shù)據(jù)韭畸。Flutter與原生項(xiàng)目的資源是不共享的分蓖,可以通過BasicMessageChannel 來獲取Native項(xiàng)目的圖標(biāo)等資源
MethodChannel
傳遞方法調(diào)用。Flutter主動調(diào)用Native的方法邪媳,并獲取相應(yīng)的返回值。比如獲取系統(tǒng)電量扩氢,發(fā)起Toast等系統(tǒng)API唉堪,可以通過這個(gè)完成据德。
EventChannel
傳遞事件。Native將時(shí)間通知到Flutter蔽豺。比如Flutter需要監(jiān)聽網(wǎng)絡(luò)情況区丑。EventChannel可以將Flutter的一個(gè)監(jiān)聽器交給Native,Native去做網(wǎng)絡(luò)廣播的監(jiān)聽修陡,當(dāng)收到廣播之后借助 EventChannel調(diào)用Flutter注冊的監(jiān)聽刊苍,完成對Flutter的事件通知。
具體實(shí)現(xiàn)
BasicMessageChannel
-
Flutter
static const messageChannel = const BasicMessageChannel('samples.flutter.io/message', StandardMessageCodec()); static const messageChannel2 = const BasicMessageChannel('smaples.flutter.io/message2', StandardMessageCodec()); Future<String> sendMessage() async { String reply = await messageChannel.send('發(fā)送給Native的數(shù)據(jù)'); print('reply: $reply'); return reply; } void receiveMessage() { messageChannel2.setMessageHandler((message) async { print('message : $message'); return '從Native端返回來的數(shù)據(jù)'濒析; }); } @Override void initState() { super.initState(); receiveMessage(); sendMessage(); }
iOS 先不動
-
Android
BasicMessageChanngl messageChannel = new BasicMessageChannel<Object>(getFlutterView(), "samples.flutter.io/message2", StandardMessageCodes.INSTANCE); // 接收來自Flutter的消息 messageChannel.setMessageHandler(new BasicMessageChannel.MessageHandler<Object>() { @Override public void onMessage(object o, BasicMessageChannel.Reply<Object> reply) { Log.d("jimbray", "OnMessage" + o); reply.reply("返回給Flutter的數(shù)據(jù)"); } }); // 發(fā)送數(shù)據(jù)給Flutter BasicMessageChannel messageChannel2 = new BasicMessageChannel<Object>( getFlutterView(), "samples.flutter.io/message2", StandardMessageCodec.INSTANCE); // 發(fā)送消息到Flutter messageChannel2.send("發(fā)送到Flutter的消息", new BasicMessageChannel.Reply<Object>() { @Override public void reply(Object o) { Log.d("jimbray", "onReply: " + o); } });
MethodChannel
-
Flutter
static const platform = const MethodChannel('samples.flutter.io/battery'); Future<Null> _getBatteryLevel() async { String batteryLevel; try { final int result = awai platform.invokeMethod('getBatteryLevel'); batteryLevel = 'BatteryLevel at $result %'; } on PlatformException catch(e) { batterylevel = 'Failed to get battery levet: "${e.message}".'; } setState(() { _batteryLevel = batterLevel; })正什; }
iOS先不動
-
Android
new MethodChannel(getFlutterView(), "samples.flutter.io/battery").setMethodCallHandler(new MethodCallHandler() { @Override public void onMethodCall(MethodCall call, Result result) { if (call.method.equals("getBatteryLevel")) { int batteryLevel = _getBatteryLevel(); if (batteryLevel != -1) { result.success(batteryLevel); } else { result.error("UNAVAILABLE", "Battery level is not available.", null); } } else { result.notImplemented(); } } }); private int getBatterylevel() { // 實(shí)現(xiàn)Android平臺的 getBatteryLevel 代碼即可 }
EventChannel
-
Flutter
static const EventChannel _eventChannel = const EventChannel('samples.flutter.io/test'); void _onEvent(Object event) { print('從Native發(fā)送過來的消息內(nèi)容: $event'); } void _onError(Object error) { print('從Native發(fā)送過來的錯(cuò)誤'); } @Override void initState() { super.initState(); _eventChannel.receiveBroadcastStream().listen(_onEvent, onError: _onError); }
iOS先不動
-
Android
new EventChannel(getFlutterView(), "samples.flutter.io/test").setStreanHandler( new EventChannel.StreamHandler() { @Override public void onListen(Object o, EventChannel.EventSink eventSink) { this.eventSink = eventSink; } @Override public void onCancel(Object o) { } }); private EventChannel.EventSink eventSink; private int count = 0; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(); eventSink.success((count++) + "主動發(fā)送消息到Flutter")号杏; } }