Files
plezy/lib/focus/owned_focus_node_binding.dart
T

40 lines
1.1 KiB
Dart

import 'package:flutter/widgets.dart';
typedef FocusNodeFactory = FocusNode Function(String? debugLabel);
FocusNode _createFocusNode(String? debugLabel) => FocusNode(debugLabel: debugLabel);
/// Owns either a caller-provided focus node or an internally-created one and
/// keeps one listener attached to exactly the active node.
class OwnedFocusNodeBinding {
OwnedFocusNodeBinding() : _createNode = _createFocusNode;
OwnedFocusNodeBinding.withFactory(this._createNode);
final FocusNodeFactory _createNode;
FocusNode? _node;
VoidCallback? _listener;
bool _ownsNode = false;
FocusNode get node => _node!;
void bind({required FocusNode? externalNode, required VoidCallback listener, String? debugLabel}) {
dispose();
_node = externalNode ?? _createNode(debugLabel);
_ownsNode = externalNode == null;
_listener = listener;
_node!.addListener(listener);
}
void dispose() {
final node = _node;
final listener = _listener;
if (node == null) return;
if (listener != null) node.removeListener(listener);
if (_ownsNode) node.dispose();
_node = null;
_listener = null;
_ownsNode = false;
}
}