当前位置:   article > 正文

Flutter与原生IOS(swift)交互系列之一_flutter swift通信

flutter swift通信

先用Android Studio创建一个空的flutter工程作为演示

可以看到根目录下有一个名为ios的目录,这个就是ios的工程目录。

我们将它展开,发现下面有许多个文件

打开苹果电脑上的Xcode

选择ios目录下的Runner.xcworkspace打开

打开之后如下图所示,我们点击AppDelegate这个文件,这个是ios工程中注册插件的地方,我们写的所有功能的插件都需要在这里注册

可以看到首次打开右上角出现了一个红色的 No such module 'Flutter'

这时只要点击运行就行

可以看到工程正常运行没有问题,之前红色的报错也消失了

这时明明工程运行起来了,又出来了一个红色错误

Incorrect argument label in call (have 'with:', expected 'withRegistry:')

这个和上面那个错误一样,只要工程能正常运行,就不需要管。

现在我们可以写代码了,在刚才的AppDelegate类里写上如下的方法:

  1. func testPlugin(messenger: FlutterBinaryMessenger) {
  2. let channel = FlutterMethodChannel(name: "plugin_apple", binaryMessenger: messenger)
  3. channel.setMethodCallHandler { (call:FlutterMethodCall, result:@escaping FlutterResult) in
  4. if (call.method == "apple_one") {
  5. result(["result":"success","code":200]);
  6. }
  7. if (call.method == "apple_two") {
  8. result(["result":"success","code":404]);
  9. }
  10. }
  11. }

上面的代码里面只需关注三个地方:

第一个是:"plugin_apple" 这是通道名称,需要和Flutter端定义的相同

第一个是:"apple_one"和"apple_two"这是方法名称,方法可以定义多个,需要和Flutter端定义的相同

第一个是:result(...) 这是方法的返回值,可以直接返回一个字符串result("data"),也可以返回一个Map格式的返回值result(["a":1,"b":2,"c":3])

然后注册这个方法,如下所示:

  1. let messenger : FlutterBinaryMessenger = window?.rootViewController as! FlutterBinaryMessenger
  2. testPlugin(messenger: messenger)

现在我们开始写Flutter端的调用代码

回到Android studio,在main.dart文件里面写如下方法

  1. Future<void> appleOne() async {
  2. MethodChannel _channel = const MethodChannel('plugin_apple');
  3. final result = await _channel.invokeMethod('apple_one');
  4. Map map = result as LinkedHashMap<Object?, Object?>;
  5. print("result: ${map["result"]}");
  6. print("code: ${map["code"]}");
  7. }
  1. Future<void> appleTwo() async {
  2. MethodChannel _channel = const MethodChannel('plugin_apple');
  3. final result = await _channel.invokeMethod('apple_two');
  4. Map map = result as LinkedHashMap<Object?, Object?>;
  5. print("result: ${map["result"]}");
  6. print("code: ${map["code"]}");
  7. }
  1. @override
  2. Widget build(BuildContext context) {
  3. return Scaffold(
  4. appBar: AppBar(
  5. title: Text(widget.title),
  6. ),
  7. body: Center(
  8. child: Column(
  9. mainAxisAlignment: MainAxisAlignment.center,
  10. children: <Widget>[
  11. GestureDetector(
  12. onTap: (){
  13. appleOne();
  14. },
  15. child: const Text('调用方法 appleOne')),
  16. const SizedBox(height: 50),
  17. GestureDetector(
  18. onTap: (){
  19. appleTwo();
  20. },
  21. child: const Text('调用方法 appleTwo')),
  22. ],
  23. ),
  24. ),
  25. );
  26. }

回到Xcode,点击这个黑色的三角图标启动项目

可以看到顺利的启动了项目~

依次点击两个按钮

查看控制台,可以看到顺利打印出了结果

Flutter与IOS基础交互就完成了~

关注WX公众号:大前端Pro 发送关键字 ios交互系列一 获取示例代码

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/383203
推荐阅读
相关标签
  

闽ICP备14008679号