IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Flutter Native for ios -> 正文阅读

[移动开发]Flutter Native for ios

?在 IOS 中实现 Flutter 与 Object-c通信:效果如下图

一共有两个页面:首先会传入一个 Flutter 路由的初始值;然后实现 原生和Flutter的相互调用

因为是用 Main.storybord 做的页面;所有跳转已经 FlutterViewController 也都是在? prepareForSegue 中实现的

?

FirstViewController.m 中的跳转

//
//  NSObject+FirstViewController.m
//  NativeFlutter
//
//  Created by John on 2021/11/22.
//

#import "FirstViewController.h"
#import "MainViewController.h"
#import <Flutter/Flutter.h>

@interface FirstViewController ()

@end

@implementation FirstViewController

- (void)viewDidLoad {
    [super viewDidLoad];

}

- (IBAction)onClick:(id)sender {

    NSLog(@"Button click %@",_textInput.text);
    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    MainViewController *vc = [sb instantiateViewControllerWithIdentifier:@"MainViewController"];
    vc.modalPresentationStyle = UIModalPresentationFullScreen;
    vc.inputParam = _textInput.text;
    [self presentViewController:vc animated:YES completion:nil];
    
   // MainViewController *vc = [MainViewController new];
    //vc.inputParam =_textInput.text;
//    TestViewController *vc = [TestViewController alloc];
//    [self presentViewController:vc animated:true completion:nil];
//    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc];
//        [self presentViewController:nav animated:YES completion:nil];
    
    
    
}
@end

MainViewController.m 中的具体实现

//
//  MainViewController.m
//  NativeFlutter
//
//  Created by John on 2021/11/22.
//

#import "MainViewController.h"
#import <Flutter/Flutter.h>
@interface MainViewController ()<FlutterStreamHandler>
@property (nonatomic) FlutterViewController* flutterViewController;
@property (nonatomic) FlutterBasicMessageChannel* messageChannel;
@property (nonatomic) FlutterEventChannel* eventChannel;
@property (nonatomic) FlutterMethodChannel* methodChannel;
@property (nonatomic) FlutterEventSink eventSink;
@end

@implementation MainViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sendMessage:) name:@"sendMessage" object:nil];

    
    NSLog(@"MainViewController %@",self.inputParam);
    
//    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
//    self.flutterViewController = [sb instantiateViewControllerWithIdentifier:@"FlutterViewController"];
//    [self.flutterViewController  setInitialRoute:self.inputParam];
//    [self initChannel];
}
#pragma mark - naviagor
- (void)prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender {
    
    if ([segue.destinationViewController isKindOfClass:[FlutterViewController class]]) {
        self.flutterViewController = segue.destinationViewController;
        [self.flutterViewController setInitialRoute:self.inputParam];
        [self initChannel];
    }
}

- (void)sendMessage:(NSNotification*)notification{
    NSString* mesage = [notification.object valueForKey:@"message"];
    NSLog(@"---要传入 Flutter的参数 :%@",mesage);
    
    
    if ([@"true" isEqual:[notification.object valueForKey:@"useEventChannel"]]) {
        //用EventChannel传递数据
        if (self.eventSink != nil) {
            self.eventSink(mesage);
        }
        
    } else {
        //用MessageChannel传递数据
        [self.messageChannel sendMessage: mesage reply:^(id  _Nullable reply) {
            if (reply != nil) {
                [self sendShow:reply];
            }
        }];
    }
}


#pragma mark - init Channel
- (void)initChannel{
    [self initMessageChannel];
    [self initEventChannel];
    [self initMethodChannel];
}
- (void)initMessageChannel{
    self.messageChannel = [FlutterBasicMessageChannel messageChannelWithName:@"BasicMessageChannelPlugin" binaryMessenger:self.flutterViewController codec:[FlutterStringCodec sharedInstance]];
    MainViewController*  __weak weakSelf = self;
    //设置消息处理器,处理来自Dart的消息
    [self.messageChannel setMessageHandler:^(NSString* message, FlutterReply reply) {
        reply([NSString stringWithFormat:@"BasicMessageChannel收到:%@",message]);
        [weakSelf sendShow:message];
    }];
}
- (void)initEventChannel{
    self.eventChannel = [FlutterEventChannel eventChannelWithName:@"EventChannelPlugin" binaryMessenger:self.flutterViewController];
    
    //设置消息处理器,处理来自Dart的消息
    [self.eventChannel setStreamHandler:self];
}
- (void)initMethodChannel{
    self.methodChannel = [FlutterMethodChannel methodChannelWithName:@"MethodChannelPlugin" binaryMessenger:self.flutterViewController];
    MainViewController*  __weak weakSelf = self;
    [self.methodChannel setMethodCallHandler:^(FlutterMethodCall * _Nonnull call, FlutterResult  _Nonnull result) {
        if ([@"send" isEqualToString:call.method]) {
            result([NSString stringWithFormat:@"MethodChannelPlugin收到:%@",call.arguments]);//返回结果给Dart);
            [weakSelf sendShow:call.arguments];
        }
    }];
}
- (void)sendShow:(NSString*) message{
    NSLog(@"------sendShow    %@",message);
    [[NSNotificationCenter defaultCenter] postNotificationName:@"showMessage" object:message];
}
//#pragma mark - <FlutterStreamHandler>
//这个onListen是Flutter端开始监听这个channel时的回调,第二个参数 EventSink是用来传数据的载体
- (FlutterError* _Nullable)onListenWithArguments:(id _Nullable)arguments eventSink:(FlutterEventSink)eventSink {

    // arguments flutter给native的参数
    // 回调给flutter, 建议使用实例指向,因为该block可以使用多次
    self.eventSink = eventSink;
    return nil;
}

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



@end

iso 原生页面中的 两个按钮的实现

//
//  ViewController.m
//  NativeFlutter
//
//  Created by John on 2021/11/22.
//

#import "ViewController.h"
#import <Flutter/Flutter.h>

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(showMessage:) name:@"showMessage" object:nil];

}

- (void)showMessage:(NSNotification*)notification{
    id params = notification.object;
    self.textInput.text = [NSString stringWithFormat:@"来自Dart:%@",params];
}



- (IBAction)onBasicMessageChannel:(id)sender {
    NSLog(@"onBasicMessageChannel");
    NSString * text=  self.textInput.text;
    [[NSNotificationCenter defaultCenter] postNotificationName:@"sendMessage" object:@{@"message": text,@"useEventChannel": @"true"}];
}

- (IBAction)onNethodChannel:(id)sender {
    NSLog(@"onNethodChannel");
    NSString * text=  self.textInput.text;
    [[NSNotificationCenter defaultCenter] postNotificationName:@"sendMessage" object:@{@"message": text,@"useEventChannel":@"false"}];
}
@end

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-24 08:03:55  更:2021-11-24 08:05:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:47:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码