Flutter與原生雙向通信BasicMessageChannel(IOS暫未測驗)
Flutter與原生相互通信的3種方式
MethodChannel:實作Flutter與原生(Android,IOS)雙向通信
BasicMessageChannel:實作Flutter與原生(Android,IOS) 雙向通信
EventChannel:實作原生(Android,iOS)向Flutter發送訊息
Demo基礎功能實作目標:
實作呼叫原生方法并進行回呼
顯示Android手機當前電量
首先在Flutter方面你需要做的是:
創建BasicMessageChannel
創建通信標識 我個人理解為鍵值 key
//BasicMessageChannel
//'com.basic.message.channel/batteryLevel'為通信標識
static const _batteryLevel= const BasicMessageChannel(
'com.basic.message.channel/batteryLevel', StandardMessageCodec());
String _batteryLevel1 = '電池電量未知';
//給原生發送訊息方法
Future<Map> sendMessage(Map arguments,BasicMessageChannel telOrbattery) async {
//電量
Map batteryMap = await_batteryLevel.send(arguments);
//決議 原生發給 Flutter 的引數
var code = batteryMap["code"];
var message = batteryMap["message"];
setState(() {
if(batteryMap != null){
print("code:$code message:$message");
}
});
return batteryMap;
}
build(BuildContext context){
return new Column(
children:[
ElevatedButton(
onPressed: () {
sendMessage({"method": "batteryLevel", "ontent": "flutterdata", "code": 100},_platform).then((value){
setState(() {
_batteryLevel1 = value.toString();
});
});
print(_batteryLevel1);
},
child: new Text('獲取電池電量')),
]
);
}
‘com.basic.message.channel/batteryLevel’:需要與Android原生方保持一致
StandardMessageCodec:為引數傳遞的編碼方式
接著我們使用AndroidStudio打開android模塊代碼:
找到MainActivity,路勁位置:android/app/src/main/java/XXXXXX/MainActivity.java
XXXX為您的包名,有的會以XX/XX/XX/XX層層的形式出現 點下去就好了
MainActivity:
public class MainActivity extends FlutterActivity {
private BasicMessageChannel<Object> mMessageChannel;
//************************************END********************************************************
//BasicMessageChannel方式
//方法封裝 key:與flutter互動的key
// setMessage:回傳的資料 Object
// methodName:flutter端的方法名
private void messageChannelFunction(String key, Object setMessage,String methodName) {
//訊息接收監聽
//BasicMessageChannel (主要是傳遞字串和一些半結構體的資料)
//創建通道
mMessageChannel = new BasicMessageChannel<Object>(
getFlutterEngine().getDartExecutor().getBinaryMessenger(),
key,
StandardMessageCodec.INSTANCE);
// 接收訊息監聽
mMessageChannel.setMessageHandler(new BasicMessageChannel.MessageHandler<Object>() {
@Override
public void onMessage(Object o, BasicMessageChannel.Reply<Object> reply) {
Map<Object, Object> arguments = (Map<Object, Object>) o;
//方法名標識
String lMethod = (String) arguments.get("method");
//測驗 reply.reply()方法 發訊息給Flutter
if (lMethod.equals(methodName)) {
// Toast.makeText(Context, "flutter 呼叫到了 android test", Toast.LENGTH_SHORT).show();
//回呼Flutter
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("message", setMessage);
resultMap.put("code", 200);
//回呼 此方法只能使用一次
reply.reply(resultMap);
}
}
});
}
//重寫onCreade方法
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
messageChannelFunction("com.basic.message.channel/batteryLevel",getBatteryLevel(),"batteryLevel");
}
//獲取手機電量
private int getBatteryLevel() {
int batteryLevel = -1;//getSystemService(BATTERY_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
BatteryManager batteryManager = (BatteryManager) getSystemService(BATTERY_SERVICE);
batteryLevel = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);
} else {
Intent intent = new ContextWrapper(getApplicationContext())
.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
batteryLevel = (intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) * 100)
/ intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
}
return batteryLevel;
}
}
需要注意的是:
private void messageChannelFunction(String key, Object setMessage,String methodName) {}
messageChannelFunction(“com.basic.message.channel/batteryLevel”,getBatteryLevel(),“batteryLevel”);
這個地方的“com.basic.message.channel/batteryLevel”需要與Flutter方保持一致
//方法名標識
String lMethod = (String) arguments.get(“method”);中“method”
需要與Flutter中
{“method”: “test2”, “ontent”: “flutter 中的資料”, “code”: 100} method保持一致
接下來就可以運行看看效果了!

GET√總體思路:
Flutter創建BasicMessageChannel
添加標識(也就是我理解的key),選擇編碼方式
進行編碼發送訊息至Android原生
原生按照識別符號與相對應Flutter系結
收到Flutter編碼的訊息后 帶上需要的引數進行回呼Flutter
以上只是個人基礎理解,如有誤導性請聯系我洗掉博客或進行修改
原創不易,希望各位老爺點完贊再走!
轉載請注明作者@As.Kai
關注我,一起成長!
@As.Kai
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/264181.html
標籤:其他
