Flutter Engine
 
Loading...
Searching...
No Matches
FlutterTextField Class Reference

#include <FlutterTextInputSemanticsObject.h>

Inheritance diagram for FlutterTextField:
FlutterTextFieldMock

Instance Methods

(instancetype) - initWithPlatformNode:fieldEditor:
 
(void) - updateString:withSelection:
 
(void) - startEditing
 

Detailed Description

An NSTextField implementation that represents the NativeViewAccessible for the FlutterTextPlatformNode

The NSAccessibility protocol does not provide full support for text editing. This appkit text field is used to get around this problem. The FlutterTextPlatformNode creates a hidden FlutterTextField, since VoiceOver only provides text editing announcements for NSTextField subclasses.

All of the text editing events in this native text field are redirected to the FlutterTextInputPlugin.

Definition at line 81 of file FlutterTextInputSemanticsObject.h.

Method Documentation

◆ initWithPlatformNode:fieldEditor:

- (instancetype) initWithPlatformNode: (flutter::FlutterTextPlatformNode*)  node
fieldEditor: (FlutterTextInputPlugin*)  plugin 

Initializes a FlutterTextField that uses the FlutterTextInputPlugin as its field editor. The text field redirects all of the text editing events to the FlutterTextInputPlugin.

Definition at line 64 of file FlutterTextInputSemanticsObject.mm.

70 fieldEditor:(FlutterTextInputPlugin*)plugin {
71 self = [super initWithFrame:NSZeroRect];
72 if (self) {
73 _node = node;
74 _plugin = plugin;
75 [self setCell:[[FlutterTextFieldCell alloc] initWithTextField:self fieldEditor:plugin]];
76 }
77 return self;
78}
FlutterTextInputPlugin * _plugin
The ax platform node for a text field.
instancetype initWithFrame

◆ startEditing

- (void) startEditing

Makes the field editor (plugin) current editor for this TextField, meaning that the text field will start getting editing events.

Definition at line 64 of file FlutterTextInputSemanticsObject.mm.

112 {
113 if (!_plugin) {
114 return;
115 }
116 if (self.currentEditor == _plugin) {
117 return;
118 }
119 if (!_node) {
120 return;
121 }
122 // Selecting text seems to be the only way to make the field editor
123 // current editor.
124 [self selectText:self];
125 NSAssert(self.currentEditor == _plugin, @"Failed to set current editor");
126
127 _plugin.client = self;
128
129 // Restore previous selection.
130 NSString* textValue = @(_node->GetStringAttribute(ax::mojom::StringAttribute::kValue).data());
131 int start = _node->GetIntAttribute(ax::mojom::IntAttribute::kTextSelStart);
132 int end = _node->GetIntAttribute(ax::mojom::IntAttribute::kTextSelEnd);
133 NSAssert((start >= 0 && end >= 0) || (start == -1 && end == -1), @"selection is invalid");
134 NSRange selection;
135 if (start >= 0 && end >= 0) {
136 selection = NSMakeRange(MIN(start, end), ABS(end - start));
137 } else {
138 // The native behavior is to place the cursor at the end of the string if
139 // there is no selection.
140 selection = NSMakeRange([self stringValue].length, 0);
141 }
142 [self updateString:textValue withSelection:selection];
143}
size_t length
const size_t start
const size_t end

Referenced by flutter::testing::TEST().

◆ updateString:withSelection:

- (void) updateString: (NSString*)  string
withSelection: (NSRange)  selection 

Updates the string value and the selection of this text field.

Calling this method is necessary for macOS to get notified about string and selection changes.

Definition at line 64 of file FlutterTextInputSemanticsObject.mm.

80 :(NSString*)string withSelection:(NSRange)selection {
81 NSAssert(_plugin.client == self,
82 @"Can't update FlutterTextField when it is not the first responder");
83 if (![[self stringValue] isEqualToString:string]) {
84 [self setStringValue:string];
85 }
86 if (!NSEqualRanges(_plugin.selectedRange, selection)) {
87 [_plugin setSelectedRange:selection];
88 }
89}

The documentation for this class was generated from the following files: