[iOS] Fix:Keyboard inset is not correct when presenting and native ViewController on FlutterViewController (#29862) (#30162)
Co-authored-by: WenJingRui <2539699336@qq.com>
diff --git a/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm b/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm
index a89ae9c..ff70c47 100644
--- a/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm
+++ b/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm
@@ -1200,9 +1200,10 @@
}
completion:^(BOOL finished) {
if (self.displayLink == currentDisplayLink) {
+ // Indicates the displaylink captured by this block is the original one,which also
+ // indicates the animation has not been interrupted from its beginning. Moreover,indicates
+ // the animation is over and there is no more animation about to exectute.
[self invalidateDisplayLink];
- }
- if (finished) {
[self removeKeyboardAnimationView];
[self ensureViewportMetricsIsCorrect];
}
diff --git a/shell/platform/darwin/ios/framework/Source/FlutterViewControllerTest.mm b/shell/platform/darwin/ios/framework/Source/FlutterViewControllerTest.mm
index 2c462e4..0bb8346 100644
--- a/shell/platform/darwin/ios/framework/Source/FlutterViewControllerTest.mm
+++ b/shell/platform/darwin/ios/framework/Source/FlutterViewControllerTest.mm
@@ -173,9 +173,17 @@
@"UIKeyboardAnimationDurationUserInfoKey" : [NSNumber numberWithDouble:0.25],
@"UIKeyboardIsLocalUserInfoKey" : [NSNumber numberWithBool:isLocal]
}];
+
+ XCTestExpectation* expectation = [self expectationWithDescription:@"update viewport"];
+ OCMStub([mockEngine updateViewportMetrics:flutter::ViewportMetrics()])
+ .ignoringNonObjectArgs()
+ .andDo(^(NSInvocation* invocation) {
+ [expectation fulfill];
+ });
id viewControllerMock = OCMPartialMock(viewController);
[viewControllerMock keyboardWillChangeFrame:notification];
OCMVerify([viewControllerMock startKeyBoardAnimation:0.25]);
+ [self waitForExpectationsWithTimeout:5.0 handler:nil];
}
- (void)testEnsureViewportMetricsWillInvokeAndDisplayLinkWillInvalidateInViewDidDisappear {