flutter pod接入和交互

1如何集成

01修改Podfile文件引入Flutter

pod 'DATKFlutterSDK', :git => 'git@git.duia.org.cn:ios/DATKFlutterSDK.git', :tag => '1.0.5'

2如何跳转

    //在控制器中, 先导入 GeneratedPluginRegistrant
    //#import <DATKFlutterSDK/GeneratedPluginRegistrant.h>
    //然后就可以直接嗨拉~
    FlutterViewController* flutterViewController = [[FlutterViewController alloc] init];
    [GeneratedPluginRegistrant registerWithRegistry:flutterViewController];
    [self.navigationController pushViewController:flutterViewController animated:YES];

03如何交互

01.flutter主动调用iOS原生的数据
    //创建FlutterViewController
    FlutterViewController* flutterViewController = [[FlutterViewController alloc] init];
    //注册插件 (不写这句, flutter里的第三方插件有可能会失效)
    [GeneratedPluginRegistrant registerWithRegistry:flutterViewController];
    //创建MethodChannel
    FlutterMethodChannel* batteryChannel = [FlutterMethodChannel
                                            methodChannelWithName:@"samples.flutter.io/responseFlutter"
                                            binaryMessenger:flutterViewController];
    //注册flutter调用原生的监听,
    [batteryChannel setMethodCallHandler:^(FlutterMethodCall* call,
                                           FlutterResult result) {
        //flutter代码里调用 iOS平台方法时 会进此block
        //根据不同的方法名, 返回不同的信息
        if ([@"getUserData" isEqualToString:call.method]) {
            result(@"{\"name\":\"张三\",\"age\":\"10\"}");
        }if ([@"otherMethod" isEqualToString:call.method]) {
            result(@"返回其他的信息");
        } else {
            //调用的方法名不存在则返回FlutterMethodNotImplemented
            result(FlutterMethodNotImplemented);
        }
    }];
    
    [self.navigationController pushViewController:flutterViewController animated:YES];
02.iOS平台主动调用flutter代码

顺序是,先跳转flutter,等flutter初始化完成, 通过1个回调方法拿到FlutterEventSink,
然后就可以通过FlutterEventSink尽情的调用flutter里的代码了

01跳转flutterViewController之前先注册StreamHandler

  //先注册Stream监听
  FlutterEventChannel* chargingChannel = [FlutterEventChannel
      eventChannelWithName:@"samples.flutter.io/requestFlutter"
           binaryMessenger: flutterViewController];
  [chargingChannel setStreamHandler:self];//需实现FlutterStreamHandler代理

  ///注册完成后可以跳转flutter控制器了
  // [self.navigationController pushViewController:flutterViewController animated:YES];

02通过onListenWithArguments方法拿到FlutterEventSink

#pragma mark - <FlutterStreamHandler>
// // 这个onListen是Flutter端开始监听这个channel时的回调,第二个参数 EventSink是用来传数据的载体。
- (FlutterError* _Nullable)onListenWithArguments:(id _Nullable)arguments
                                       eventSink:(FlutterEventSink)eventSink {
    _eventSink = eventSink;
    if (_eventSink){//拿到_eventSink, 可以在任意地方调用eventSink
        eventSink(@"哈哈,Fluter你好啊~");
        eventSink(@"噶为何噶文化委");
    }
    return nil;
}

/// flutter不再接收
- (FlutterError* _Nullable)onCancelWithArguments:(id _Nullable)arguments {
    // arguments flutter给native的参数
    _eventSink = nil;
    return nil;
}

(由于iOS和flutter的交互都是异步进行的,我们可以把flutter理解成'远程服务器', 方法调用理解成'网络接口调用')


ViewController.m 完整代码

#import "ViewController.h"
#import <DATKFlutterSDK/GeneratedPluginRegistrant.h>

@interface ViewController ()<FlutterStreamHandler>
@end
@implementation ViewController{
    FlutterEventSink _eventSink;
}
- (void)viewDidLoad {
    [super viewDidLoad];
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    //创建FlutterViewController
    FlutterViewController* flutterViewController = [[FlutterViewController alloc] init];
    //注册插件 (不写这句, flutter里的第三方插件有可能会失效)
    [GeneratedPluginRegistrant registerWithRegistry:flutterViewController];
    //创建MethodChannel
    FlutterMethodChannel* batteryChannel = [FlutterMethodChannel
                                            methodChannelWithName:@"samples.flutter.io/daMethod"
                                            binaryMessenger:flutterViewController];
    //注册flutter调用原生的监听,
    [batteryChannel setMethodCallHandler:^(FlutterMethodCall* call,
                                           FlutterResult result) {
        //flutter代码里调用 iOS平台方法时 会进此block
        //根据不同的方法名, 返回不同的信息
        if ([@"getUserData" isEqualToString:call.method]) {
            result(@"{\"name\":\"张三\",\"age\":\"10\"}");
        }if ([@"otherMethod" isEqualToString:call.method]) {
            result(@"返回其他的信息");
        } else {
            //调用的方法名不存在则返回FlutterMethodNotImplemented
            result(FlutterMethodNotImplemented);
        }
    }];
    FlutterEventChannel* chargingChannel = [FlutterEventChannel
                                            eventChannelWithName:@"samples.flutter.io/requestFlutter"
                                            binaryMessenger:flutterViewController];
    [chargingChannel setStreamHandler:self];//需实现FlutterStreamHandler代理
    [self.navigationController pushViewController:flutterViewController animated:YES];
}

#pragma mark - <FlutterStreamHandler>
// // 这个onListen是Flutter端开始监听这个channel时的回调,第二个参数 EventSink是用来传数据的载体。
- (FlutterError* _Nullable)onListenWithArguments:(id _Nullable)arguments
                                       eventSink:(FlutterEventSink)eventSink {
    _eventSink = eventSink;
    if (_eventSink){//拿到_eventSink, 可以在任意地方调用eventSink
        eventSink(@"哈哈,Fluter你好啊~");
        eventSink(@"噶为何噶文化委");
    }
    return nil;
}
/// flutter不再接收
- (FlutterError* _Nullable)onCancelWithArguments:(id _Nullable)arguments {
    // arguments flutter给native的参数
    _eventSink = nil;
    return nil;
}
@end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 参考[快速熟悉Dart语法](https://www.jianshu.com/p/3d927a7bf020) 1、...
    GaNSCI以太阅读 282评论 0 0
  • android 9.0 的源码相比之前做了一次重构,带着学习的心态来捋一捋 9.0 中启动 activity 的流...
    猫KK阅读 307评论 0 1
  • 爬虫遇到的问题:关于网页需要跳转后才能访问的问题 有时候访问一些网页,显示网页需要等待5s才能跳转到所需要的网页:...
    侯文虎阅读 760评论 0 0
  • go流程和函数 1.if else 条件判断:如果满足条件就做某事,否则做另一件事。if (条件){}else{}...
    bug去无踪阅读 228评论 0 0
  • 诗人的房间 达武旦 一个人有多少美好时光 能安放在静默的宇宙 任它自由衰老 而不被现实摧毁 在一位诗人的房间里 记...
    达武旦阅读 241评论 0 1