@@ -319,14 +319,48 @@ - (void)dispatchPointerDataPacket:(std::unique_ptr<flutter::PointerDataPacket>)p
319319 self.platformView ->DispatchPointerDataPacket (std::move (packet));
320320}
321321
322- - (fml::WeakPtr<flutter::PlatformView>)platformView {
323- if (!_shell) {
324- return {};
322+ - (void )installFirstFrameCallback : (void (^)(void ))block {
323+ if (!self.platformView ) {
324+ return ;
325+ }
326+
327+ __weak FlutterEngine* weakSelf = self;
328+ self.platformView ->SetNextFrameCallback ([weakSelf, block] {
329+ FlutterEngine* strongSelf = weakSelf;
330+ if (!strongSelf) {
331+ return ;
332+ }
333+ FML_DCHECK (strongSelf.platformTaskRunner );
334+ FML_DCHECK (strongSelf.rasterTaskRunner );
335+ FML_DCHECK (strongSelf.rasterTaskRunner ->RunsTasksOnCurrentThread ());
336+ // Get callback on raster thread and jump back to platform thread.
337+ strongSelf.platformTaskRunner ->PostTask ([block]() { block (); });
338+ });
339+ }
340+
341+ - (void )enableSemantics : (BOOL )enabled withFlags : (int64_t )flags {
342+ if (!self.platformView ) {
343+ return ;
344+ }
345+ self.platformView ->SetSemanticsEnabled (enabled);
346+ self.platformView ->SetAccessibilityFeatures (flags);
347+ }
348+
349+ - (void )notifyViewCreated {
350+ if (!self.platformView ) {
351+ return ;
325352 }
326- return _shell-> GetPlatformView ();
353+ self. platformView -> NotifyCreated ();
327354}
328355
329- - (flutter::PlatformViewIOS*)iosPlatformView {
356+ - (void )notifyViewDestroyed {
357+ if (!self.platformView ) {
358+ return ;
359+ }
360+ self.platformView ->NotifyDestroyed ();
361+ }
362+
363+ - (flutter::PlatformViewIOS*)platformView {
330364 if (!_shell) {
331365 return nullptr ;
332366 }
@@ -402,16 +436,16 @@ - (void)sendKeyEvent:(const FlutterKeyEvent&)event
402436}
403437
404438- (void )ensureSemanticsEnabled {
405- if (!self.iosPlatformView ) {
439+ if (!self.platformView ) {
406440 return ;
407441 }
408- self.iosPlatformView ->SetSemanticsEnabled (true );
442+ self.platformView ->SetSemanticsEnabled (true );
409443}
410444
411445- (void )setViewController : (FlutterViewController*)viewController {
412- FML_DCHECK (self.iosPlatformView );
446+ FML_DCHECK (self.platformView );
413447 _viewController = viewController;
414- self.iosPlatformView ->SetOwnerViewController (_viewController);
448+ self.platformView ->SetOwnerViewController (_viewController);
415449 [self maybeSetupPlatformViewChannels ];
416450 [self updateDisplays ];
417451 self.textInputPlugin .viewController = viewController;
@@ -432,8 +466,8 @@ - (void)setViewController:(FlutterViewController*)viewController {
432466}
433467
434468- (void )attachView {
435- FML_DCHECK (self.iosPlatformView );
436- self.iosPlatformView ->attachView ();
469+ FML_DCHECK (self.platformView );
470+ self.platformView ->attachView ();
437471}
438472
439473- (void )setFlutterViewControllerWillDeallocObserver : (id <NSObject >)observer {
@@ -451,11 +485,8 @@ - (void)notifyViewControllerDeallocated {
451485 self.textInputPlugin .viewController = nil ;
452486 if (!self.allowHeadlessExecution ) {
453487 [self destroyContext ];
454- } else if (_shell) {
455- flutter::PlatformViewIOS* platform_view = [self iosPlatformView ];
456- if (platform_view) {
457- platform_view->SetOwnerViewController ({});
458- }
488+ } else if (self.platformView ) {
489+ self.platformView ->SetOwnerViewController ({});
459490 }
460491 [self .textInputPlugin resetViewResponder ];
461492 _viewController = nil ;
@@ -1215,8 +1246,8 @@ - (FlutterBinaryMessengerConnection)setMessageHandlerOnChannel:(NSString*)channe
12151246 taskQueue : (NSObject <FlutterTaskQueue>* _Nullable)taskQueue {
12161247 NSParameterAssert (channel);
12171248 if (_shell && _shell->IsSetup ()) {
1218- self.iosPlatformView ->GetPlatformMessageHandlerIos ()->SetMessageHandler (channel.UTF8String ,
1219- handler, taskQueue);
1249+ self.platformView ->GetPlatformMessageHandlerIos ()->SetMessageHandler (channel.UTF8String ,
1250+ handler, taskQueue);
12201251 return _connections->AquireConnection (channel.UTF8String );
12211252 } else {
12221253 NSAssert (!handler, @" Setting a message handler before the FlutterEngine has been run." );
@@ -1229,18 +1260,18 @@ - (void)cleanUpConnection:(FlutterBinaryMessengerConnection)connection {
12291260 if (_shell && _shell->IsSetup ()) {
12301261 std::string channel = _connections->CleanupConnection (connection);
12311262 if (!channel.empty ()) {
1232- self.iosPlatformView ->GetPlatformMessageHandlerIos ()->SetMessageHandler (channel.c_str (), nil ,
1233- nil );
1263+ self.platformView ->GetPlatformMessageHandlerIos ()->SetMessageHandler (channel.c_str (), nil ,
1264+ nil );
12341265 }
12351266 }
12361267}
12371268
12381269#pragma mark - FlutterTextureRegistry
12391270
12401271- (int64_t )registerTexture : (NSObject <FlutterTexture>*)texture {
1241- FML_DCHECK (self.iosPlatformView );
1272+ FML_DCHECK (self.platformView );
12421273 int64_t textureId = self.nextTextureId ++;
1243- self.iosPlatformView ->RegisterExternalTexture (textureId, texture);
1274+ self.platformView ->RegisterExternalTexture (textureId, texture);
12441275 return textureId;
12451276}
12461277
@@ -1350,6 +1381,13 @@ - (void)onLocaleUpdated:(NSNotification*)notification {
13501381 [self .localizationChannel invokeMethod: @" setLocale" arguments: localeData];
13511382}
13521383
1384+ - (void )waitForFirstFrameSync : (NSTimeInterval )timeout
1385+ callback : (NS_NOESCAPE void (^_Nonnull)(BOOL didTimeout))callback {
1386+ fml::TimeDelta waitTime = fml::TimeDelta::FromMilliseconds (timeout * 1000 );
1387+ fml::Status status = self.shell .WaitForFirstFrame (waitTime);
1388+ callback (status.code () == fml::StatusCode::kDeadlineExceeded );
1389+ }
1390+
13531391- (void )waitForFirstFrame : (NSTimeInterval )timeout
13541392 callback : (void (^_Nonnull)(BOOL didTimeout))callback {
13551393 dispatch_queue_t queue = dispatch_get_global_queue (QOS_CLASS_BACKGROUND, 0 );
@@ -1364,8 +1402,8 @@ - (void)waitForFirstFrame:(NSTimeInterval)timeout
13641402 }
13651403
13661404 fml::TimeDelta waitTime = fml::TimeDelta::FromMilliseconds (timeout * 1000 );
1367- didTimeout =
1368- strongSelf. shell . WaitForFirstFrame (waitTime) .code () == fml::StatusCode::kDeadlineExceeded ;
1405+ fml::Status status = strongSelf. shell . WaitForFirstFrame (waitTime);
1406+ didTimeout = status .code () == fml::StatusCode::kDeadlineExceeded ;
13691407 });
13701408
13711409 // Only execute the main queue task once the background task has completely finished executing.
0 commit comments