| // Copyright 2013 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. | |
| part of dart.ui; | |
| /// A wrapper for a raw callback handle. | |
| /// | |
| /// This is the return type for [PluginUtilities.getCallbackHandle]. | |
| class CallbackHandle { | |
| /// Create an instance using a raw callback handle. | |
| /// | |
| /// Only values produced by a call to [CallbackHandle.toRawHandle] should be | |
| /// used, otherwise this object will be an invalid handle. | |
| CallbackHandle.fromRawHandle(this._handle); | |
| final int _handle; | |
| /// Get the raw callback handle to pass over a [MethodChannel] or [SendPort] | |
| /// (to pass to another [Isolate]). | |
| int toRawHandle() => _handle; | |
| @override | |
| bool operator ==(Object other) { | |
| if (runtimeType != other.runtimeType) { | |
| return false; | |
| } | |
| return other is CallbackHandle && other._handle == _handle; | |
| } | |
| @override | |
| int get hashCode => _handle.hashCode; | |
| } | |
| /// Functionality for Flutter plugin authors. | |
| /// | |
| /// See also: | |
| /// | |
| /// * [IsolateNameServer], which provides utilities for dealing with | |
| /// [Isolate]s. | |
| abstract final class PluginUtilities { | |
| static final Map<Function, CallbackHandle?> _forwardCache = <Function, CallbackHandle?>{}; | |
| static final Map<CallbackHandle, Function?> _backwardCache = <CallbackHandle, Function?>{}; | |
| /// Get a handle to a named top-level or static callback function which can | |
| /// be easily passed between isolates. | |
| /// | |
| /// The `callback` argument must not be null. | |
| /// | |
| /// Returns a [CallbackHandle] that can be provided to | |
| /// [PluginUtilities.getCallbackFromHandle] to retrieve a tear-off of the | |
| /// original callback. If `callback` is not a top-level or static function, | |
| /// null is returned. | |
| static CallbackHandle? getCallbackHandle(Function callback) { | |
| return _forwardCache.putIfAbsent(callback, () { | |
| final int? handle = _getCallbackHandle(callback); | |
| return handle != null ? CallbackHandle.fromRawHandle(handle) : null; | |
| }); | |
| } | |
| /// Get a tear-off of a named top-level or static callback represented by a | |
| /// handle. | |
| /// | |
| /// The `handle` argument must not be null. | |
| /// | |
| /// If `handle` is not a valid handle returned by | |
| /// [PluginUtilities.getCallbackHandle], null is returned. Otherwise, a | |
| /// tear-off of the callback associated with `handle` is returned. | |
| static Function? getCallbackFromHandle(CallbackHandle handle) { | |
| return _backwardCache.putIfAbsent(handle, () => _getCallbackFromHandle(handle.toRawHandle())); | |
| } | |
| } |