diff --git a/shell/platform/darwin/ios/BUILD.gn b/shell/platform/darwin/ios/BUILD.gn index 52e626188993c..63ca777abfbd9 100644 --- a/shell/platform/darwin/ios/BUILD.gn +++ b/shell/platform/darwin/ios/BUILD.gn @@ -39,6 +39,31 @@ _flutter_framework_headers = [ _flutter_framework_headers_copy_dir = "$_flutter_framework_dir/Headers" +source_set("flutter_framework_source_arc") { + visibility = [ ":*" ] + cflags_objc = flutter_cflags_objc_arc + cflags_objcc = flutter_cflags_objcc_arc + + defines = [ "FLUTTER_FRAMEWORK=1" ] + allow_circular_includes_from = [ ":flutter_framework_source" ] + deps = [ + ":flutter_framework_source", + "//flutter/fml", + "//flutter/shell/platform/common:common_cpp_input", + "//flutter/shell/platform/darwin/common:framework_shared", + "//third_party/icu", + ] + public_configs = [ "//flutter:config" ] + + sources = [ + "framework/Source/FlutterTextInputDelegate.h", + "framework/Source/FlutterTextInputPlugin.h", + "framework/Source/FlutterTextInputPlugin.mm", + ] + + frameworks = [ "UIKit.framework" ] +} + source_set("flutter_framework_source") { visibility = [ ":*" ] cflags_objc = flutter_cflags_objc @@ -81,9 +106,6 @@ source_set("flutter_framework_source") { "framework/Source/FlutterSemanticsScrollView.mm", "framework/Source/FlutterSpellCheckPlugin.h", "framework/Source/FlutterSpellCheckPlugin.mm", - "framework/Source/FlutterTextInputDelegate.h", - "framework/Source/FlutterTextInputPlugin.h", - "framework/Source/FlutterTextInputPlugin.mm", "framework/Source/FlutterUIPressProxy.h", "framework/Source/FlutterUIPressProxy.mm", "framework/Source/FlutterUndoManagerDelegate.h", @@ -209,6 +231,7 @@ source_set("ios_test_flutter_mrc") { ] deps = [ ":flutter_framework_source", + ":flutter_framework_source_arc", "//flutter/common:common", "//flutter/lib/ui:ui", "//flutter/shell/common:common", @@ -267,6 +290,7 @@ shared_library("ios_test_flutter") { deps = [ ":flutter_framework", ":flutter_framework_source", + ":flutter_framework_source_arc", ":ios_gpu_configuration", ":ios_test_flutter_mrc", "//flutter/common:common", @@ -295,7 +319,10 @@ shared_library("create_flutter_framework_dylib") { public = _flutter_framework_headers - deps = [ ":flutter_framework_source" ] + deps = [ + ":flutter_framework_source", + ":flutter_framework_source_arc", + ] public_configs = [ "//flutter:config" ] } diff --git a/shell/platform/darwin/ios/framework/Source/FlutterTextInputPlugin.h b/shell/platform/darwin/ios/framework/Source/FlutterTextInputPlugin.h index e4fc4e4a352f9..51acd0e41085e 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterTextInputPlugin.h +++ b/shell/platform/darwin/ios/framework/Source/FlutterTextInputPlugin.h @@ -7,7 +7,6 @@ #import -#import "flutter/fml/memory/weak_ptr.h" #import "flutter/shell/platform/common/text_editing_delta.h" #import "flutter/shell/platform/darwin/common/framework/Headers/FlutterChannels.h" #import "flutter/shell/platform/darwin/ios/framework/Source/FlutterIndirectScribbleDelegate.h" @@ -30,8 +29,8 @@ typedef NS_ENUM(NSInteger, FlutterScribbleInteractionStatus) { @interface FlutterTextInputPlugin : NSObject -@property(nonatomic, assign) UIViewController* viewController; -@property(nonatomic, assign) id indirectScribbleDelegate; +@property(nonatomic, weak) UIViewController* viewController; +@property(nonatomic, weak) id indirectScribbleDelegate; @property(nonatomic, strong) NSMutableDictionary* scribbleElements; @@ -125,7 +124,7 @@ FLUTTER_DARWIN_EXPORT @property(readwrite, copy) UITextRange* selectedTextRange; @property(nonatomic, strong) UITextRange* markedTextRange; @property(nonatomic, copy) NSDictionary* markedTextStyle; -@property(nonatomic, assign) id inputDelegate; +@property(nonatomic, weak) id inputDelegate; // UITextInputTraits @property(nonatomic) UITextAutocapitalizationType autocapitalizationType; @@ -141,10 +140,10 @@ FLUTTER_DARWIN_EXPORT @property(nonatomic) UITextSmartDashesType smartDashesType API_AVAILABLE(ios(11.0)); @property(nonatomic, copy) UITextContentType textContentType API_AVAILABLE(ios(10.0)); -@property(nonatomic, assign) UIAccessibilityElement* backingTextInputAccessibilityObject; +@property(nonatomic, weak) UIAccessibilityElement* backingTextInputAccessibilityObject; // Scribble Support -@property(nonatomic, assign) id viewResponder; +@property(nonatomic, weak) id viewResponder; @property(nonatomic) FlutterScribbleFocusStatus scribbleFocusStatus; @property(nonatomic, strong) NSArray* selectionRects; - (void)resetScribbleInteractionStatusIfEnding; diff --git a/shell/platform/darwin/ios/framework/Source/FlutterTextInputPlugin.mm b/shell/platform/darwin/ios/framework/Source/FlutterTextInputPlugin.mm index fc4230015cd26..edd6a594edfc0 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterTextInputPlugin.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterTextInputPlugin.mm @@ -12,6 +12,8 @@ #include "flutter/fml/logging.h" #include "flutter/fml/platform/darwin/string_range_sanitization.h" +FLUTTER_ASSERT_ARC + static const char kTextAffinityDownstream[] = "TextAffinity.downstream"; static const char kTextAffinityUpstream[] = "TextAffinity.upstream"; // A delay before enabling the accessibility of FlutterTextInputView after @@ -477,7 +479,7 @@ static BOOL IsSelectionRectCloserToPoint(CGPoint point, @implementation FlutterTextPosition + (instancetype)positionWithIndex:(NSUInteger)index { - return [[[FlutterTextPosition alloc] initWithIndex:index] autorelease]; + return [[FlutterTextPosition alloc] initWithIndex:index]; } - (instancetype)initWithIndex:(NSUInteger)index { @@ -495,7 +497,7 @@ - (instancetype)initWithIndex:(NSUInteger)index { @implementation FlutterTextRange + (instancetype)rangeWithNSRange:(NSRange)range { - return [[[FlutterTextRange alloc] initWithNSRange:range] autorelease]; + return [[FlutterTextRange alloc] initWithNSRange:range]; } - (instancetype)initWithNSRange:(NSRange)range { @@ -531,7 +533,7 @@ - (BOOL)isEqualTo:(FlutterTextRange*)other { @interface FlutterTokenizer () -@property(nonatomic, assign) FlutterTextInputView* textInputView; +@property(nonatomic, weak) FlutterTextInputView* textInputView; @end @@ -610,21 +612,21 @@ + (instancetype)selectionRectWithRectAndInfo:(CGRect)rect containsStart:(BOOL)containsStart containsEnd:(BOOL)containsEnd isVertical:(BOOL)isVertical { - return [[[FlutterTextSelectionRect alloc] initWithRectAndInfo:rect - position:position - writingDirection:writingDirection - containsStart:containsStart - containsEnd:containsEnd - isVertical:isVertical] autorelease]; + return [[FlutterTextSelectionRect alloc] initWithRectAndInfo:rect + position:position + writingDirection:writingDirection + containsStart:containsStart + containsEnd:containsEnd + isVertical:isVertical]; } + (instancetype)selectionRectWithRect:(CGRect)rect position:(NSUInteger)position { - return [[[FlutterTextSelectionRect alloc] initWithRectAndInfo:rect - position:position - writingDirection:UITextWritingDirectionNatural - containsStart:NO - containsEnd:NO - isVertical:NO] autorelease]; + return [[FlutterTextSelectionRect alloc] initWithRectAndInfo:rect + position:position + writingDirection:UITextWritingDirectionNatural + containsStart:NO + containsEnd:NO + isVertical:NO]; } - (instancetype)initWithRectAndInfo:(CGRect)rect @@ -674,11 +676,6 @@ @implementation FlutterSecureTextInputView { UITextField* _textField; } -- (void)dealloc { - [_textField release]; - [super dealloc]; -} - - (UITextField*)textField { if (!_textField) { _textField = [[UITextField alloc] init]; @@ -705,12 +702,12 @@ - (void)forwardInvocation:(NSInvocation*)anInvocation { @end @interface FlutterTextInputPlugin () -@property(nonatomic, readonly) fml::WeakPtr weakPtr; -@property(nonatomic, readonly) id textInputDelegate; +@property(nonatomic, readonly, weak) id textInputDelegate; @property(nonatomic, readonly) UIView* hostView; @end @interface FlutterTextInputView () +@property(nonatomic, readonly, weak) FlutterTextInputPlugin* textInputPlugin; @property(nonatomic, copy) NSString* autofillId; @property(nonatomic, readonly) CATransform3D editableTransform; @property(nonatomic, assign) CGRect markedRect; @@ -737,10 +734,6 @@ @implementation FlutterTextInputView { // when the app shows its own in-flutter keyboard. bool _isSystemKeyboardEnabled; bool _isFloatingCursorActive; - fml::WeakPtr _textInputPlugin; - // The view has reached end of life, and is no longer - // allowed to access its textInputDelegate. - BOOL _decommissioned; bool _enableInteractiveSelection; UITextInteraction* _textInteraction API_AVAILABLE(ios(13.0)); } @@ -750,7 +743,7 @@ @implementation FlutterTextInputView { - (instancetype)initWithOwner:(FlutterTextInputPlugin*)textInputPlugin { self = [super initWithFrame:CGRectZero]; if (self) { - _textInputPlugin = textInputPlugin.weakPtr; + _textInputPlugin = textInputPlugin; _textInputClient = 0; _selectionAffinity = kTextAffinityUpstream; @@ -778,14 +771,12 @@ - (instancetype)initWithOwner:(FlutterTextInputPlugin*)textInputPlugin { _enableDeltaModel = NO; _enableInteractiveSelection = YES; _accessibilityEnabled = NO; - _decommissioned = NO; _smartQuotesType = UITextSmartQuotesTypeYes; _smartDashesType = UITextSmartDashesTypeYes; _selectionRects = [[NSArray alloc] init]; if (@available(iOS 14.0, *)) { - UIScribbleInteraction* interaction = - [[[UIScribbleInteraction alloc] initWithDelegate:self] autorelease]; + UIScribbleInteraction* interaction = [[UIScribbleInteraction alloc] initWithDelegate:self]; [self addInteraction:interaction]; } } @@ -794,7 +785,6 @@ - (instancetype)initWithOwner:(FlutterTextInputPlugin*)textInputPlugin { } - (void)configureWithDictionary:(NSDictionary*)configuration { - NSAssert(!_decommissioned, @"Attempt to reuse a decommissioned view, for %@", configuration); NSDictionary* inputType = configuration[kKeyboardType]; NSString* keyboardAppearance = configuration[kKeyboardAppearance]; NSDictionary* autofill = configuration[kAutofillProperties]; @@ -870,37 +860,7 @@ - (UIInputViewController*)inputViewController { } - (id)textInputDelegate { - return _textInputPlugin.get().textInputDelegate; -} - -// Declares that the view has reached end of life, and -// is no longer allowed to access its textInputDelegate. -// -// UIKit may retain this view (even after it's been removed -// from the view hierarchy) so that it may outlive the plugin/engine, -// in which case _textInputDelegate will become a dangling pointer. - -// The text input plugin needs to call decommission when it should -// not have access to its FlutterTextInputDelegate any more. -- (void)decommission { - _decommissioned = YES; -} - -- (void)dealloc { - [_text release]; - [_markedText release]; - [_markedTextRange release]; - [_selectedTextRange release]; - [_tokenizer release]; - [_autofillId release]; - [_inputViewController release]; - [_selectionRects release]; - [_markedTextStyle release]; - [_textContentType release]; - [_textInteraction release]; - [_temporarilyDeletedComposedCharacter release]; - _temporarilyDeletedComposedCharacter = nil; - [super dealloc]; + return _textInputPlugin.textInputDelegate; } - (void)setTextInputClient:(int)client { @@ -910,8 +870,7 @@ - (void)setTextInputClient:(int)client { - (UITextInteraction*)textInteraction API_AVAILABLE(ios(13.0)) { if (!_textInteraction) { - _textInteraction = - [[UITextInteraction textInteractionForMode:UITextInteractionModeEditable] retain]; + _textInteraction = [UITextInteraction textInteractionForMode:UITextInteractionModeEditable]; _textInteraction.textInput = self; } return _textInteraction; @@ -1136,13 +1095,12 @@ - (void)selectAll:(id)sender { } - (UITextRange*)selectedTextRange { - return [[_selectedTextRange copy] autorelease]; + return [_selectedTextRange copy]; } // Change the range of selected text, without notifying the framework. - (void)setSelectedTextRangeLocal:(UITextRange*)selectedTextRange { if (_selectedTextRange != selectedTextRange) { - UITextRange* oldSelectedRange = _selectedTextRange; if (self.hasText) { FlutterTextRange* flutterTextRange = (FlutterTextRange*)selectedTextRange; _selectedTextRange = [[FlutterTextRange @@ -1150,7 +1108,6 @@ - (void)setSelectedTextRangeLocal:(UITextRange*)selectedTextRange { } else { _selectedTextRange = [selectedTextRange copy]; } - [oldSelectedRange release]; } } @@ -1227,7 +1184,7 @@ - (void)replaceRangeLocal:(NSRange)range withText:(NSString*)text { } - (void)replaceRange:(UITextRange*)range withText:(NSString*)text { - NSString* textBeforeChange = [[self.text copy] autorelease]; + NSString* textBeforeChange = [self.text copy]; NSRange replaceRange = ((FlutterTextRange*)range).range; [self replaceRangeLocal:replaceRange withText:text]; if (_enableDeltaModel) { @@ -1302,7 +1259,7 @@ - (BOOL)shouldChangeTextInRange:(UITextRange*)range replacementText:(NSString*)t } - (void)setMarkedText:(NSString*)markedText selectedRange:(NSRange)markedSelectedRange { - NSString* textBeforeChange = [[self.text copy] autorelease]; + NSString* textBeforeChange = [self.text copy]; NSRange selectedRange = _selectedTextRange.range; NSRange markedTextRange = ((FlutterTextRange*)self.markedTextRange).range; NSRange actualReplacedRange; @@ -1603,7 +1560,7 @@ - (CGRect)firstRectForRange:(UITextRange*)range { _cachedFirstRect = [self localRectFromFrameworkTransform:rect]; } - UIView* hostView = _textInputPlugin.get().hostView; + UIView* hostView = _textInputPlugin.hostView; NSAssert(hostView == nil || [self isDescendantOfView:hostView], @"%@ is not a descendant of %@", self, hostView); return hostView ? [hostView convertRect:_cachedFirstRect toView:self] : _cachedFirstRect; @@ -1684,7 +1641,7 @@ - (NSArray*)selectionRectsForRange:(UITextRange*)range { @"Expected a FlutterTextPosition for range.end (got %@).", [range.end class]); NSUInteger start = ((FlutterTextPosition*)range.start).index; NSUInteger end = ((FlutterTextPosition*)range.end).index; - NSMutableArray* rects = [[[NSMutableArray alloc] init] autorelease]; + NSMutableArray* rects = [[NSMutableArray alloc] init]; for (NSUInteger i = 0; i < [_selectionRects count]; i++) { if (_selectionRects[i].position >= start && _selectionRects[i].position <= end) { float width = _selectionRects[i].rect.size.width; @@ -1910,7 +1867,6 @@ - (void)insertText:(NSString*)text { _scribbleFocusStatus = FlutterScribbleFocusStatusUnfocused; [self resetScribbleInteractionStatusIfEnding]; self.selectionRects = copiedRects; - [copiedRects release]; _selectionAffinity = kTextAffinityDownstream; [self replaceRange:_selectedTextRange withText:text]; } @@ -1920,7 +1876,7 @@ - (UITextPlaceholder*)insertTextPlaceholderWithSize:(CGSize)size API_AVAILABLE(i insertTextPlaceholderWithSize:size withClient:_textInputClient]; _hasPlaceholder = YES; - return [[[FlutterTextPlaceholder alloc] init] autorelease]; + return [[FlutterTextPlaceholder alloc] init]; } - (void)removeTextPlaceholder:(UITextPlaceholder*)textPlaceholder API_AVAILABLE(ios(13.0)) { @@ -1959,7 +1915,6 @@ - (void)deleteBackward { } _selectedTextRange = [[FlutterTextRange rangeWithNSRange:newRange] copy]; - [oldSelectedRange release]; } } @@ -2005,22 +1960,22 @@ - (void)resetScribbleInteractionStatusIfEnding { #pragma mark - Key Events Handling - (void)pressesBegan:(NSSet*)presses withEvent:(UIPressesEvent*)event API_AVAILABLE(ios(9.0)) { - [_textInputPlugin.get().viewController pressesBegan:presses withEvent:event]; + [_textInputPlugin.viewController pressesBegan:presses withEvent:event]; } - (void)pressesChanged:(NSSet*)presses withEvent:(UIPressesEvent*)event API_AVAILABLE(ios(9.0)) { - [_textInputPlugin.get().viewController pressesChanged:presses withEvent:event]; + [_textInputPlugin.viewController pressesChanged:presses withEvent:event]; } - (void)pressesEnded:(NSSet*)presses withEvent:(UIPressesEvent*)event API_AVAILABLE(ios(9.0)) { - [_textInputPlugin.get().viewController pressesEnded:presses withEvent:event]; + [_textInputPlugin.viewController pressesEnded:presses withEvent:event]; } - (void)pressesCancelled:(NSSet*)presses withEvent:(UIPressesEvent*)event API_AVAILABLE(ios(9.0)) { - [_textInputPlugin.get().viewController pressesCancelled:presses withEvent:event]; + [_textInputPlugin.viewController pressesCancelled:presses withEvent:event]; } @end @@ -2060,13 +2015,13 @@ - (void)enableActiveViewAccessibility; @end @interface FlutterTimerProxy : NSObject -@property(nonatomic, assign) FlutterTextInputPlugin* target; +@property(nonatomic, weak) FlutterTextInputPlugin* target; @end @implementation FlutterTimerProxy + (instancetype)proxyWithTarget:(FlutterTextInputPlugin*)target { - FlutterTimerProxy* proxy = [[self new] autorelease]; + FlutterTimerProxy* proxy = [[self alloc] init]; if (proxy) { proxy.target = target; } @@ -2090,8 +2045,6 @@ @interface FlutterTextInputPlugin () @implementation FlutterTextInputPlugin { NSTimer* _enableFlutterTextInputViewAccessibilityTimer; - std::unique_ptr> _weakFactory; - id _textInputDelegate; } - (instancetype)initWithDelegate:(id)textInputDelegate { @@ -2100,7 +2053,6 @@ - (instancetype)initWithDelegate:(id)textInputDelegate if (self) { // `_textInputDelegate` is a weak reference because it should retain FlutterTextInputPlugin. _textInputDelegate = textInputDelegate; - _weakFactory = std::make_unique>(self); _autofillContext = [[NSMutableDictionary alloc] init]; _inputHider = [[FlutterTextInputViewAccessibilityHider alloc] init]; _scribbleElements = [[NSMutableDictionary alloc] init]; @@ -2110,19 +2062,12 @@ - (instancetype)initWithDelegate:(id)textInputDelegate } - (void)dealloc { - _weakFactory.reset(); [self hideTextInput]; - [_activeView release]; - [_inputHider release]; - [_autofillContext release]; - [_scribbleElements release]; - [super dealloc]; } - (void)removeEnableFlutterTextInputViewAccessibilityTimer { if (_enableFlutterTextInputViewAccessibilityTimer) { [_enableFlutterTextInputViewAccessibilityTimer invalidate]; - [_enableFlutterTextInputViewAccessibilityTimer release]; _enableFlutterTextInputViewAccessibilityTimer = nil; } } @@ -2131,14 +2076,6 @@ - (void)removeEnableFlutterTextInputViewAccessibilityTimer { return _activeView; } -- (id)textInputDelegate { - return _textInputDelegate; -} - -- (fml::WeakPtr)weakPtr { - return _weakFactory->GetWeakPtr(); -} - - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { NSString* method = call.method; id args = call.arguments; @@ -2208,7 +2145,7 @@ - (void)updateMarkedRect:(NSDictionary*)dictionary { - (void)setSelectionRects:(NSArray*)rects { NSMutableArray* rectsAsRect = - [[[NSMutableArray alloc] initWithCapacity:[rects count]] autorelease]; + [[NSMutableArray alloc] initWithCapacity:[rects count]]; for (NSUInteger i = 0; i < [rects count]; i++) { NSArray* rect = rects[i]; [rectsAsRect @@ -2242,11 +2179,11 @@ - (void)showTextInput { // This results in accessibility focus stuck at the FlutterTextInputView. if (!_enableFlutterTextInputViewAccessibilityTimer) { _enableFlutterTextInputViewAccessibilityTimer = - [[NSTimer scheduledTimerWithTimeInterval:kUITextInputAccessibilityEnablingDelaySeconds - target:[FlutterTimerProxy proxyWithTarget:self] - selector:@selector(enableActiveViewAccessibility) - userInfo:nil - repeats:NO] retain]; + [NSTimer scheduledTimerWithTimeInterval:kUITextInputAccessibilityEnablingDelaySeconds + target:[FlutterTimerProxy proxyWithTarget:self] + selector:@selector(enableActiveViewAccessibility) + userInfo:nil + repeats:NO]; } [_activeView becomeFirstResponder]; } @@ -2353,7 +2290,7 @@ - (FlutterTextInputView*)createInputViewWith:(NSDictionary*)configuration { [_autofillContext removeObjectForKey:autofillId]; } } - return [newView autorelease]; + return newView; } - (FlutterTextInputView*)updateAndShowAutofillViews:(NSArray*)fields @@ -2408,7 +2345,7 @@ - (FlutterTextInputView*)getOrCreateAutofillableView:(NSDictionary*)field if (!inputView) { inputView = needsPasswordAutofill ? [FlutterSecureTextInputView alloc] : [FlutterTextInputView alloc]; - inputView = [[inputView initWithOwner:self] autorelease]; + inputView = [inputView initWithOwner:self]; [self addToInputParentViewIfNeeded:inputView]; } @@ -2431,11 +2368,9 @@ - (UIView*)hostView { return _inputHider.subviews; } -// Decommissions (See the "decommission" method on FlutterTextInputView) and removes -// every installed input field, unless it's in the current autofill context. +// Removes every installed input field, unless it's in the current autofill context. // -// The active view will be decommissioned and removed from its superview too, if -// includeActiveView is YES. +// The active view will be removed from its superview too, if includeActiveView is YES. // When clearText is YES, the text on the input fields will be set to empty before // they are removed from the view hierarchy, to avoid triggering autofill save. // If delayRemoval is true, removeFromSuperview will be scheduled on the runloop and @@ -2454,7 +2389,6 @@ - (void)cleanUpViewHierarchy:(BOOL)includeActiveView if (clearText) { [inputView replaceRangeLocal:NSMakeRange(0, inputView.text.length) withText:@""]; } - [inputView decommission]; if (delayRemoval) { [inputView performSelector:@selector(removeFromSuperview) withObject:nil afterDelay:0.1]; } else { @@ -2571,7 +2505,7 @@ - (void)indirectScribbleInteraction:(UIIndirectScribbleInteraction*)interaction requestElementsInRect:rect result:^(id _Nullable result) { NSMutableArray* elements = - [[[NSMutableArray alloc] init] autorelease]; + [[NSMutableArray alloc] init]; if ([result isKindOfClass:[NSArray class]]) { for (NSArray* elementArray in result) { [elements addObject:elementArray[0]]; @@ -2596,8 +2530,8 @@ - (void)setupIndirectScribbleInteraction:(id)viewResponder if (@available(iOS 14.0, *)) { UIView* parentView = viewResponder.view; if (parentView != nil) { - UIIndirectScribbleInteraction* scribbleInteraction = [[[UIIndirectScribbleInteraction alloc] - initWithDelegate:(id)self] autorelease]; + UIIndirectScribbleInteraction* scribbleInteraction = [[UIIndirectScribbleInteraction alloc] + initWithDelegate:(id)self]; [parentView addInteraction:scribbleInteraction]; } } diff --git a/shell/platform/darwin/ios/framework/Source/FlutterTextInputPluginTest.mm b/shell/platform/darwin/ios/framework/Source/FlutterTextInputPluginTest.mm index 462ea9e8359af..459a74335bcfa 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterTextInputPluginTest.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterTextInputPluginTest.mm @@ -66,7 +66,6 @@ - (void)cleanUpViewHierarchy:(BOOL)includeActiveView delayRemoval:(BOOL)delayRemoval; - (NSArray*)textInputViews; - (UIView*)hostView; -- (fml::WeakPtr)getWeakPtr; - (void)addToInputParentViewIfNeeded:(FlutterTextInputView*)inputView; - (void)startLiveTextInput; @end