| // 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 Foundation | |
| import AppKit | |
| import FlutterMacOS | |
| /** | |
| The code behind a storyboard view which splits a flutter view and a macOS view. | |
| */ | |
| class MainViewController: NSViewController, NativeViewControllerDelegate { | |
| static let emptyString: String = "" | |
| static let ping: String = "ping" | |
| static let channel: String = "increment" | |
| var nativeViewController: NativeViewController? | |
| var flutterViewController: FlutterViewController? | |
| var messageChannel: FlutterBasicMessageChannel? | |
| override func viewDidLoad() { | |
| super.viewDidLoad() | |
| } | |
| override func prepare(for segue: NSStoryboardSegue, sender: Any?) { | |
| if segue.identifier == "NativeViewControllerSegue" { | |
| self.nativeViewController = segue.destinationController as? NativeViewController | |
| // Since`MainViewController` owns the platform channel, but not the | |
| // UI elements that trigger an action, those UI elements need a reference | |
| // to this controller to send messages on the platform channel. | |
| self.nativeViewController?.delegate = self | |
| } | |
| if segue.identifier == "FlutterViewControllerSegue" { | |
| self.flutterViewController = segue.destinationController as? FlutterViewController | |
| RegisterMethodChannel(registry: self.flutterViewController!) | |
| weak var weakSelf = self | |
| messageChannel?.setMessageHandler({ (message, reply) in | |
| // Dispatch an event, incrementing the counter in this case, when *any* | |
| // message is received. | |
| // Depending on the order of initialization, the nativeViewController | |
| // might not be initialized until this point. | |
| weakSelf?.nativeViewController?.didReceiveIncrement() | |
| reply(MainViewController.emptyString) | |
| }) | |
| } | |
| } | |
| func RegisterMethodChannel(registry: FlutterPluginRegistry) { | |
| let registrar = registry.registrar(forPlugin: "") | |
| messageChannel = FlutterBasicMessageChannel( | |
| name: MainViewController.channel, | |
| binaryMessenger: registrar.messenger, | |
| codec: FlutterStringCodec.sharedInstance()) | |
| } | |
| // Call in any instance where `ping` is to be sent through the `increment` | |
| // channel. | |
| func didTapIncrementButton() { | |
| self.messageChannel?.sendMessage(MainViewController.ping) | |
| } | |
| } |