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

全部评论

相关推荐

10-18 13:01
已编辑
西安理工大学 C++
小米内推大使:建议技能还是放上面吧,hr和技术面试官第一眼想看的应该是技能点和他们岗位是否匹配
点赞 评论 收藏
分享
一个菜鸡罢了:哥们,感觉你的简历还是有点问题的,我提几点建议,看看能不能提供一点帮助 1. ”新余学院“别加粗,课程不清楚是否有必要写,感觉版面不如拿来写一下做过的事情,教育经历是你的弱势就尽量少写 2. “干部及社团经历”和“自我评价”删掉 3. 论文后面的“录用”和“小修”啥的都删掉,默认全录用,问了再说,反正小修毕业前肯定能发出来 4. 工作经验和研究成果没有体现你的个人贡献,着重包装一下个人贡献
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务