// Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #import <Flutter/Flutter.h> #import "AppDelegate.h" #import "HybridViewController.h" @interface HybridViewController () @end static NSString *_kChannel = @"increment"; static NSString *_kPing = @"ping"; @implementation HybridViewController { FlutterBasicMessageChannel *_messageChannel; } - (FlutterEngine *)engine { return [(AppDelegate *)[[UIApplication sharedApplication] delegate] engine]; } - (FlutterBasicMessageChannel *)reloadMessageChannel { return [(AppDelegate *)[[UIApplication sharedApplication] delegate] reloadMessageChannel]; } - (void)viewDidLoad { [super viewDidLoad]; self.title = @"Hybrid Flutter/Native"; UIStackView *stackView = [[UIStackView alloc] initWithFrame:self.view.frame]; stackView.axis = UILayoutConstraintAxisVertical; stackView.distribution = UIStackViewDistributionFillEqually; stackView.layoutMargins = UIEdgeInsetsMake(0, 0, 50, 0); stackView.layoutMarginsRelativeArrangement = YES; [self.view addSubview:stackView]; self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil]; NativeViewController *nativeViewController = [[NativeViewController alloc] initWithDelegate:self]; [self addChildViewController:nativeViewController]; [stackView addArrangedSubview:nativeViewController.view]; [nativeViewController didMoveToParentViewController:self]; _flutterViewController = [[FlutterViewController alloc] initWithEngine:[self engine] nibName:nil bundle:nil]; [[self reloadMessageChannel] sendMessage:@"hybrid"]; _messageChannel = [[FlutterBasicMessageChannel alloc] initWithName:_kChannel binaryMessenger:_flutterViewController.binaryMessenger codec:[FlutterStringCodec sharedInstance]]; [self addChildViewController:_flutterViewController]; [stackView addArrangedSubview:_flutterViewController.view]; [_flutterViewController didMoveToParentViewController:self]; __weak NativeViewController *weakNativeViewController = nativeViewController; [_messageChannel setMessageHandler:^(id message, FlutterReply reply) { [weakNativeViewController didReceiveIncrement]; reply(@""); }]; } - (void)didTapIncrementButton { [_messageChannel sendMessage:_kPing]; } @end