mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00
70 lines
2.3 KiB
Swift
70 lines
2.3 KiB
Swift
// 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)
|
|
}
|
|
|
|
}
|