Flutter与原生交互方式之MethodChannel使用

MethodChannel

Flutter与原生交互的一种方式,此种方式传递的是方法,可以双向传递,可以携带参数,双向传递都可以有返回值

Flutter给原生端发送消息
  • Flutter端代码配置
final methodChannel = const MethodChannel('test_method_channel');
Future<void> sendMessageFromMethodChannel() async {
  final result = await methodChannel.invokeMethod("method_one");
  print(result);
}

定义发送消息 MethodChannel生成对应的channel,需要指定channelname

发送消息使用的是:invokeMethod

指定方法名,也可以带参数,有返回值

  • 原生端代码配置

先定义一个MethodChannelManager管理类

var channel: FlutterMethodChannel

init(messager: FlutterBinaryMessenger) {

   channel = FlutterMethodChannel(name: "test_method_channel", binaryMessenger: messager)

     channel.setMethodCallHandler { (call , result) in

     print("接收到了来自Flutter发送的方法\(call.method)")

     result("我是原生返回给Flutter的消息")
   }
}

定义好channel,注册方法 setMethodCallHandler

AppDelegate入口函数处需要初始化

let messager = window.rootViewController as! FlutterBinaryMessenger

 MethodChannelManager(messager: messager)

Simulator Screen Shot - 14_16.2 - 2023-08-16 at 17.29.33.png

运行项目后,点击触发事件,打印如下:

截屏2023-08-16 17.31.17.png

原生(iOS为例)Flutter发送消息
  • iOS原生端配置
var channel: FlutterMethodChannel

    init(messager: FlutterBinaryMessenger) {

        channel = FlutterMethodChannel(name: "test_method_channel", binaryMessenger: messager)

        channel.setMethodCallHandler { (call , result) in

            print("接收到了来自Flutter发送的方法\(call.method)")

            result("我是原生返回给Flutter的消息")

            self.startTimer()

        }

    }

    

    func startTimer() {

        Timer.scheduledTimer(timeInterval: TimeInterval(2), target: self, selector: #selector(sendMessageToFlutter), userInfo: nil, repeats: false)

    }

    

    @objc func sendMessageToFlutter() {

        channel.invokeMethod("ios_method", arguments: "我是原生主动发送过来的") {(result) in

            print(result)

        }

    }

原生端发送消息也是调用 invokeMethod,也可以以闭包形式接收到Flutter端的返回值

  • Flutter端配置
Future<void> setMethodChannelCallHandler() async {
  methodChannel.setMethodCallHandler((call) async {
    print('Flutter收到了原生端的方法:${call.method}, 传参为:${call.arguments} ---- call: $call');
    return Future.value('我是Flutter回传给原生端的数据');
  });
}

@override
void initState() {
  // TODO: implement initState
    super.initState();
    setMethodChannelCallHandler();
}

Flutter中配置的setMethodChannelCallHandler也可以给原生回传数据,直接返回一个 Future即可

运行打印结果如下:

截屏2023-08-16 17.38.44.png

全部评论

相关推荐

01-24 08:13
已编辑
合肥工业大学 Java
程序员牛肉:没啥问题。标准的流水线简历,但是学历好一点,所以应该是有约面的机会的。 这段时间可以考虑把自己的两个项目彻底的理一理。争取能够讲清楚每一个功能点
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务