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