blob: 9585090f6ee4e21408ecbb9586db6cafe7849ff1 [file] [log] [blame]
// 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)
}
}