|  | // 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 |