Flutter与原生双向通信BasicMessageChannel(IOS暂未测试)

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

猜你喜欢

转载自blog.csdn.net/qq_42362997/article/details/114099512