美文网首页
Android与flutter 的消息通讯

Android与flutter 的消息通讯

作者: 匠人plus | 来源:发表于2020-02-06 11:24 被阅读0次

Flutter 与 Android iOS 原生的通信有以下三种方式

    BasicMessageChannel:
    用于传递字符串和半结构化的信息,Flutter和平台端进行消息数据交换时候可以使用。

    MethodChannel:
    用于传递方法调用(method invocation),Flutter和平台端进行直接方法调用时候可以使用。

    EventChannel:
    用于数据流(event streams)的通信,Flutter和平台端进行事件监听、取消等可以使用。

以下以BasicMessageChannel为例,介绍以下用法:

先创建一个工具类

public class PlatformUtil {
    private static String Default_Message_Key = "key_platform_default";
    public PlatformUtil(BinaryMessenger binaryMessenger) {
        this.binaryMessenger = binaryMessenger;
    }
    private BasicMessageChannel<Object> messageChannel;
    private MethodChannel methodChannel;
    private EventChannel eventChannel;
    private BinaryMessenger binaryMessenger;
    public BasicMessageChannel createBasicMessageChannel(String key) {
        if (messageChannel == null)
            messageChannel = new BasicMessageChannel<>(binaryMessenger, key, StandardMessageCodec.INSTANCE);
        return messageChannel;
    }

    public BasicMessageChannel createBasicMessageChannel() {
        return createBasicMessageChannel(Default_Message_Key);
    }

    public MethodChannel createMethodChannel(String key) {
        if (methodChannel == null)
            methodChannel = new MethodChannel(binaryMessenger, key, StandardMethodCodec.INSTANCE);
        return methodChannel;
    }

    public MethodChannel createMethodChannel() {
        return createMethodChannel(Default_Message_Key);
    }

    public EventChannel createEventChannel(String key) {
        if (eventChannel == null)
            eventChannel = new EventChannel(binaryMessenger, key, StandardMethodCodec.INSTANCE);
        return eventChannel;
    }

    public EventChannel createEventChannel() {
        return createEventChannel(Default_Message_Key);
    }

}

创建一个FlutterActicity

public class TestAty extends FlutterActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addFlutterView();
        requestData();
    }
    private PlatformUtil platformUtil;
    private void  addFlutterView(){
        FlutterView flutterView  = Flutter.createView(this,getLifecycle(),"test1");
        FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
                FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT);
        platformUtil = new PlatformUtil(flutterView);
        addContentView(flutterView,layoutParams);
    }

    protected void requestData() {
        //test send msg
        JSONObject object = new JSONObject();
        try {
            object.put("code","200");
            object.put("message","send");
            object.put("data","i want to send message to you");
        }catch (Exception e){
            e.toString();
        }
        platformUtil.createBasicMessageChannel().send(object.toString(), new BasicMessageChannel.Reply() {
            @Override
            public void reply(@Nullable Object reply) {
                L.e("receive--"+reply.toString());
            }
        });
        platformUtil.createBasicMessageChannel().setMessageHandler(new BasicMessageChannel.MessageHandler() {
            @Override
            public void onMessage(@Nullable Object message, @NonNull BasicMessageChannel.Reply reply) {
                L.e("receive--"+message.toString());
                try {
                    object.put("code","200");
                    object.put("message","receive");
                    object.put("data","i know");
                }catch (Exception e){
                    e.toString();
                }
                reply.reply(object.toString());
            }
        });
        //test call method
        //test register event
    }
}

创建一个dart工具类

import 'package:flutter/services.dart';
import 'dart:convert';
const String default_key_code = "key_platform_default";
var messageChannel = const BasicMessageChannel(default_key_code, StandardMessageCodec());

void sendMessage() async{
  Map sourceMap  = new Map<String,String>();
  sourceMap.putIfAbsent("code", ()=>("200"));
  sourceMap.putIfAbsent("message", ()=>("test"));
  sourceMap.putIfAbsent("data", ()=>("testData"));
  String jsonString = jsonEncode(sourceMap);
  print(jsonString);
  try{
    String reply = await messageChannel.send(jsonString);
    print("dart:receive--"+reply.toString());
  }on PlatformException catch(e){
    print(e);
  }
}

void receiveMessage(){
  messageChannel.setMessageHandler((message) async{
    print("dart:receive--+$message");
    TestMode testMode = new TestMode("200", "receive", "222");
    return jsonEncode(testMode.toJson());
  });
}
class TestMode{
  String code;
  String message;
  String data;

  TestMode(this.code, this.message, this.data);

  TestMode.fromJson(Map<dynamic,dynamic> json){
    code = json['code'];
    message = json['message'];
    data = json['data'];
  }
  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['code'] = this.code;
    data['message'] = this.message;
    data['data'] = this.data;
    return data;
  }
}

创建一个dart widget

import 'package:flutter/material.dart';


import 'platform_util.dart';
class MyTestApp extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    receiveMessage();
    sendMessage();
    return new MaterialApp(
      title: 'welcome use flutter',
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text('welcome title'),

        ),
        body: new Center(
          child: new Text('welcome body'),
        ),
      ),
    );
  }
}

运行得到如下结果:

2020-02-06 10:43:15.808 14590-14929/com.aa.bb I/flutter: dart:receive--+{"code":"200","message":"send","data":"i want to send message to you"}
2020-02-06 10:43:15.813 14590-14929/com.aa.bb I/flutter: {"code":"200","message":"test","data":"testData"}
2020-02-06 10:43:15.827 14590-14590/com.aa.bb E/=====Leen=====: receive--{"code":"200","message":"test","data":"testData"}
2020-02-06 10:43:16.247 14590-14590/com.aa.bb E/=====Leen=====: receive--{"code":"200","message":"receive","data":"222"}
2020-02-06 10:43:16.418 14590-14929/com.aa.bb I/flutter: dart:receive--{"code":"200","message":"receive","data":"i know"}

相关文章

网友评论

      本文标题:Android与flutter 的消息通讯

      本文链接:https://www.haomeiwen.com/subject/iekrxhtx.html