Skip to content

[ios] Extract SplashScreenManager from FlutterViewController#185405

Merged
cbracken merged 3 commits into
flutter:masterfrom
cbracken:extract-splashsceen-manager
Apr 24, 2026
Merged

[ios] Extract SplashScreenManager from FlutterViewController#185405
cbracken merged 3 commits into
flutter:masterfrom
cbracken:extract-splashsceen-manager

Conversation

@cbracken

@cbracken cbracken commented Apr 22, 2026

Copy link
Copy Markdown
Member

This makes progress towards reducing the complexity of FlutterViewController by refactoring orthogonal functionality into separate classes.

FlutterViewController's splash screen management logic is self-contained, which makes it an ideal candidate to be extracted into its own class, and add test coverage while we're at it.

While making this change, I got hung-up on why we were explicitly removing the splash screen from the superview right before we nil it out (which also removes it from the superview), then immediately bail out. I updated the existing comments in installSplashScreenViewIfNecessary to make that a code clearer to future readers.

This also makes partial progress towards #157140 by making possible future refactoring method calls out of FlutterViewController's initialisers and dealloc. In this case self.splashScreenManager is technically a method call.

Issue: #157140

Pre-launch Checklist

If you need help, consider asking for advice on the #hackers-new channel on Discord.

If this change needs to override an active code freeze, provide a comment explaining why. The code freeze workflow can be overridden by code reviewers. See pinned issues for any active code freezes with guidance.

Note: The Flutter team is currently trialing the use of Gemini Code Assist for GitHub. Comments from the gemini-code-assist bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member's review for guidance on which automated comments should be addressed.

@cbracken cbracken requested a review from a team as a code owner April 22, 2026 09:58
@github-actions github-actions Bot added platform-ios iOS applications specifically engine flutter/engine related. See also e: labels. team-ios Owned by iOS platform team labels Apr 22, 2026
@cbracken cbracken requested a review from loic-sharma April 22, 2026 09:59
@cbracken

cbracken commented Apr 22, 2026

Copy link
Copy Markdown
Member Author

@loic-sharma going from memory that you were the one who wrote this... or at least that you did it for the macOS embedder so maybe the most likely candidate? If not, please reassign to whoever's the best person to take a look these days. :)

Edit: Thinking about it, I think the original version of this may trace back as far as @xster pre-Flutter 1.0.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request refactors iOS splash screen management by introducing a SplashScreenManager class and delegating logic from FlutterViewController, accompanied by new unit tests. Feedback suggests ensuring the manager is initialized in all FlutterViewController entry points, removing redundant initializations, reordering constructors to follow the style guide, and ensuring the splash screen frame is correctly updated during installation.

@cbracken cbracken force-pushed the extract-splashsceen-manager branch 3 times, most recently from 2d3baae to 65f9b53 Compare April 22, 2026 10:16
@cbracken cbracken added the CICD Run CI/CD label Apr 22, 2026
@cbracken cbracken requested a review from hellohuanlin April 22, 2026 10:35
@cbracken cbracken force-pushed the extract-splashsceen-manager branch from 65f9b53 to 3f72762 Compare April 22, 2026 11:09
@github-actions github-actions Bot removed the CICD Run CI/CD label Apr 22, 2026
@cbracken cbracken added the CICD Run CI/CD label Apr 22, 2026
@cbracken cbracken force-pushed the extract-splashsceen-manager branch from 3f72762 to 9ad2ac6 Compare April 22, 2026 12:23
@github-actions github-actions Bot removed the CICD Run CI/CD label Apr 22, 2026
@cbracken cbracken added the CICD Run CI/CD label Apr 22, 2026
@cbracken cbracken force-pushed the extract-splashsceen-manager branch from 9ad2ac6 to abbe8a0 Compare April 22, 2026 12:26
@github-actions github-actions Bot removed the CICD Run CI/CD label Apr 22, 2026
@jmagman jmagman added the CICD Run CI/CD label Apr 22, 2026
@hellohuanlin

Copy link
Copy Markdown
Contributor

Also related: #173071

@loic-sharma

Copy link
Copy Markdown
Member

@loic-sharma going from memory that you were the one who wrote this... or at least that you did it for the macOS embedder so maybe the most likely candidate? If not, please reassign to whoever's the best person to take a look these days. :)

Edit: Thinking about it, I think the original version of this may trace back as far as @xster pre-Flutter 1.0.

Yup this predates me. I did the Windows side of this :)

[x] The FlutterViewController complexity is too damn high!

😂

hellohuanlin
hellohuanlin previously approved these changes Apr 23, 2026
As a certain NY mayoral candidate once said, "The FlutterViewController
is too damn complex!".

FlutterViewController's splash screen management logic is
self-contained, which makes it an ideal candidate to be extracted into
its own class, and add test coverage while we're at it.

While making this change, I got hung-up on why we were explicitly
removing the splash screen from the superview right before we nil it out
(which also removes it from the superview), then immediately bail out. I
updated the existing comments in installSplashScreenViewIfNecessary to
make that a code clearer to future readers.

This also makes partial progress towards flutter#157140 by refactoring splash screen
loading and cleanup calls out of FlutterViewController's initialisers
and dealloc.

Issue: flutter#157140
@cbracken cbracken force-pushed the extract-splashsceen-manager branch from abbe8a0 to eef2a54 Compare April 23, 2026 11:14
@flutter-dashboard flutter-dashboard Bot removed the CICD Run CI/CD label Apr 23, 2026
@cbracken cbracken force-pushed the extract-splashsceen-manager branch from eef2a54 to e34f532 Compare April 23, 2026 11:15
@cbracken cbracken force-pushed the extract-splashsceen-manager branch from e34f532 to 1247038 Compare April 23, 2026 12:32
@flutter-dashboard flutter-dashboard Bot removed the CICD Run CI/CD label Apr 23, 2026
goderbauer
goderbauer previously approved these changes Apr 23, 2026

@goderbauer goderbauer left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM to addressing the review comments.

@cbracken cbracken added the CICD Run CI/CD label Apr 23, 2026
@cbracken cbracken enabled auto-merge April 23, 2026 13:40
@cbracken cbracken force-pushed the extract-splashsceen-manager branch from 1247038 to a444181 Compare April 23, 2026 14:34
@flutter-dashboard flutter-dashboard Bot removed the CICD Run CI/CD label Apr 23, 2026
@cbracken cbracken added the CICD Run CI/CD label Apr 23, 2026
goderbauer
goderbauer previously approved these changes Apr 23, 2026
@cbracken

Copy link
Copy Markdown
Member Author

Nice! Enough small changes => enough CI runs that it caught a flake. Explanation and fix in: 71cf910

But I need a re-review. Sorry.

@cbracken cbracken force-pushed the extract-splashsceen-manager branch from 71cf910 to aeccd41 Compare April 24, 2026 00:29
@cbracken cbracken added the CICD Run CI/CD label Apr 24, 2026
Tests passed locally but
testLoadDefaultSplashScreenViewFailsWhenStoryboardNotFound crashed in
*some* CI runs with:

```
Test Case '-[ios_test_flutter_swift.SplashScreenManagerTests testLoadDefaultSplashScreenViewFailsWhenStoryboardNotFound]' started.
IosUnitTests(19638,0x10b879200) malloc: enabling scribbling to detect mods to free blocks
IosUnitTests(19638) MallocStackLogging: could not tag MSL-related memory as no_footprint, so those pages will be included in process footprint - (null)
IosUnitTests(19638) MallocStackLogging: recording malloc (and VM allocation) stacks using lite mode
2026-04-23 08:57:59.075045-0700 IosUnitTests[19638:136527] [General] Failed to send CA Event for app launch measurements for ca_event_type: 0 event_name: com.apple.app_launch_measurement.FirstFramePresentationMetric
2026-04-23 08:57:59.145240-0700 IosUnitTests[19638:136528] [General] Failed to send CA Event for app launch measurements for ca_event_type: 1 event_name: com.apple.app_launch_measurement.ExtendedLaunchMetrics
```

MockBundle subclassed Bundle, but relied on the default initializer.
Bundle is a class cluster and the default initializer really wants a
real bundle with a physical directory on disk. The mock overrides the
infoDictionary and path(forResource:ofType:) methods, but any other
methods will be on some uninitialised garbage version of Bundle.

To work around this, I bootstrapped it with the bundle for the tests
themselves. We still mock out the two methods we care about for the
test, but this should avoid the crash.
@cbracken cbracken force-pushed the extract-splashsceen-manager branch from aeccd41 to c753710 Compare April 24, 2026 02:00
@github-actions github-actions Bot removed the CICD Run CI/CD label Apr 24, 2026
@cbracken cbracken added the CICD Run CI/CD label Apr 24, 2026

@goderbauer goderbauer left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@cbracken cbracken added this pull request to the merge queue Apr 24, 2026
Merged via the queue into flutter:master with commit 43d4a36 Apr 24, 2026
194 checks passed
@cbracken cbracken deleted the extract-splashsceen-manager branch April 24, 2026 08:20
auto-submit Bot pushed a commit to flutter/packages that referenced this pull request Apr 24, 2026
Roll Flutter from 5e4f16931847 to aeb96234de86 (42 revisions)

flutter/flutter@5e4f169...aeb9623

2026-04-24 robert.ancell@canonical.com Fix leak on error case (flutter/flutter#185516)
2026-04-24 engine-flutter-autoroll@skia.org Roll Skia from 04c6c369cfd0 to 1c9b0b9141e9 (2 revisions) (flutter/flutter#185529)
2026-04-24 engine-flutter-autoroll@skia.org Roll Dart SDK from f386b11262f6 to c26627715892 (1 revision) (flutter/flutter#185526)
2026-04-24 engine-flutter-autoroll@skia.org Roll Skia from 290a056fcd0e to 04c6c369cfd0 (2 revisions) (flutter/flutter#185525)
2026-04-24 chris@bracken.jp [ios] Extract SplashScreenManager from FlutterViewController (flutter/flutter#185405)
2026-04-24 engine-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from j3UCWZhWx7zSl9Asy... to 9fPnyEo9PaNdXtasl... (flutter/flutter#185523)
2026-04-24 engine-flutter-autoroll@skia.org Roll Skia from 4c8bedd3c932 to 290a056fcd0e (1 revision) (flutter/flutter#185518)
2026-04-24 engine-flutter-autoroll@skia.org Roll Dart SDK from 70665fc3fd2e to f386b11262f6 (2 revisions) (flutter/flutter#185512)
2026-04-24 97480502+b-luk@users.noreply.github.com Handle hairline strokes in UberSDF (flutter/flutter#184895)
2026-04-24 engine-flutter-autoroll@skia.org Roll Skia from ea20c73ac72c to 4c8bedd3c932 (3 revisions) (flutter/flutter#185509)
2026-04-24 58529443+srujzs@users.noreply.github.com Use relative path for reloadedSourcesUri and reloaded modules (flutter/flutter#184598)
2026-04-24 98614782+auto-submit[bot]@users.noreply.github.com Reverts "Run all flutter/flutter macOS tests using Xcode 26 and iOS 26 simulator (#185431)" (flutter/flutter#185513)
2026-04-24 engine-flutter-autoroll@skia.org Roll Skia from e8d00d634c22 to ea20c73ac72c (8 revisions) (flutter/flutter#185500)
2026-04-23 okorohelijah@google.com Run all flutter/flutter macOS tests using Xcode 26 and iOS 26 simulator (flutter/flutter#185431)
2026-04-23 rmolivares@renzo-olivares.dev update team-text-input pr triage link to filter out "waiting for response" label (flutter/flutter#185499)
2026-04-23 jason-simmons@users.noreply.github.com Check for overflow when computing the pixel buffer size for an animated PNG frame (flutter/flutter#185442)
2026-04-23 reinar@crypt.ws Impeller: Recreate Vulkan transients on surface size change (flutter/flutter#185122)
2026-04-23 matt.kosarek@canonical.com Updating the windowing API for sized to content regular and dialog windows + removing the decorated flag (flutter/flutter#184977)
2026-04-23 engine-flutter-autoroll@skia.org Roll Dart SDK from 634991935e9a to 70665fc3fd2e (2 revisions) (flutter/flutter#185488)
2026-04-23 louisehsu@google.com Updating ios triage link (flutter/flutter#185437)
2026-04-23 34871572+gmackall@users.noreply.github.com Revert "Preprovision Android NDK for flavored builds and reuse matchi… (flutter/flutter#185439)
2026-04-23 1961493+harryterkelsen@users.noreply.github.com fix(web): Fix LateInitializationError in CkSurface and SkwasmSurface (flutter/flutter#185116)
2026-04-23 1961493+harryterkelsen@users.noreply.github.com [web] Implement stepped image downscaling for CanvasKit and Skwasm (flutter/flutter#184741)
2026-04-23 30870216+gaaclarke@users.noreply.github.com Made wide_gamut_macos only run on arm64 machines (flutter/flutter#185486)
2026-04-23 chris@bracken.jp [ios] Update documentation for FlutterAppDelegate.pluginRegistrant (flutter/flutter#185201)
2026-04-23 engine-flutter-autoroll@skia.org Roll Dart SDK from bdf48933f3cf to 634991935e9a (1 revision) (flutter/flutter#185462)
2026-04-23 engine-flutter-autoroll@skia.org Roll Skia from 5fe6162546b1 to e8d00d634c22 (3 revisions) (flutter/flutter#185459)
2026-04-23 engine-flutter-autoroll@skia.org Roll Skia from 0049c5d91b08 to 5fe6162546b1 (1 revision) (flutter/flutter#185455)
2026-04-23 engine-flutter-autoroll@skia.org Roll Dart SDK from 9648f446f131 to bdf48933f3cf (19 revisions) (flutter/flutter#185451)
2026-04-23 engine-flutter-autoroll@skia.org Roll Skia from 11640d1cbc5c to 0049c5d91b08 (11 revisions) (flutter/flutter#185453)
2026-04-23 ishaquehassan@gmail.com Add disposal guidance to CurvedAnimation and CurveTween docs (flutter/flutter#184569)
2026-04-23 ishaquehassan@gmail.com Add `clipBehavior` parameter to `AnimatedCrossFade` (flutter/flutter#184545)
2026-04-23 rmacnak@google.com [fuchsia] Ask for only VMEX, not ambient-replace-as-executable. (flutter/flutter#185099)
2026-04-23 47866232+chunhtai@users.noreply.github.com Unify SemanticUpdateBuilder API for web and non-web (flutter/flutter#185433)
2026-04-22 68919043+Istiak-Ahmed78@users.noreply.github.com Fix ImageInfo.isCloneOf tests by moving async work to setUp (flutter/flutter#185254)
2026-04-22 engine-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from UdpQnaP5eSaDZd3-i... to j3UCWZhWx7zSl9Asy... (flutter/flutter#185438)
2026-04-22 30870216+gaaclarke@users.noreply.github.com Adds script to run malioc locally (flutter/flutter#185371)
2026-04-22 47866232+chunhtai@users.noreply.github.com Add await mechanism to setClipboard in android_semantics_integration test (flutter/flutter#185428)
2026-04-22 43054281+camsim99@users.noreply.github.com Add ability to pass flags to `et run` (flutter/flutter#185109)
2026-04-22 47866232+chunhtai@users.noreply.github.com Add more guidelines for code review bot (flutter/flutter#185367)
2026-04-22 danny@tuppeny.com Roll pub packages (flutter/flutter#185274)
2026-04-22 saurabhmirajkar000@gmail.com Fix incorrect scale parameter reference in Image constructor docs (flutter/flutter#185403)

If this roll has caused a breakage, revert this CL and stop the roller
using the controls here:
https://autoroll.skia.org/r/flutter-packages
...
creatorpiyush pushed a commit to creatorpiyush/packages that referenced this pull request Jun 10, 2026
…r#11576)

Roll Flutter from 5e4f16931847 to aeb96234de86 (42 revisions)

flutter/flutter@5e4f169...aeb9623

2026-04-24 robert.ancell@canonical.com Fix leak on error case (flutter/flutter#185516)
2026-04-24 engine-flutter-autoroll@skia.org Roll Skia from 04c6c369cfd0 to 1c9b0b9141e9 (2 revisions) (flutter/flutter#185529)
2026-04-24 engine-flutter-autoroll@skia.org Roll Dart SDK from f386b11262f6 to c26627715892 (1 revision) (flutter/flutter#185526)
2026-04-24 engine-flutter-autoroll@skia.org Roll Skia from 290a056fcd0e to 04c6c369cfd0 (2 revisions) (flutter/flutter#185525)
2026-04-24 chris@bracken.jp [ios] Extract SplashScreenManager from FlutterViewController (flutter/flutter#185405)
2026-04-24 engine-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from j3UCWZhWx7zSl9Asy... to 9fPnyEo9PaNdXtasl... (flutter/flutter#185523)
2026-04-24 engine-flutter-autoroll@skia.org Roll Skia from 4c8bedd3c932 to 290a056fcd0e (1 revision) (flutter/flutter#185518)
2026-04-24 engine-flutter-autoroll@skia.org Roll Dart SDK from 70665fc3fd2e to f386b11262f6 (2 revisions) (flutter/flutter#185512)
2026-04-24 97480502+b-luk@users.noreply.github.com Handle hairline strokes in UberSDF (flutter/flutter#184895)
2026-04-24 engine-flutter-autoroll@skia.org Roll Skia from ea20c73ac72c to 4c8bedd3c932 (3 revisions) (flutter/flutter#185509)
2026-04-24 58529443+srujzs@users.noreply.github.com Use relative path for reloadedSourcesUri and reloaded modules (flutter/flutter#184598)
2026-04-24 98614782+auto-submit[bot]@users.noreply.github.com Reverts "Run all flutter/flutter macOS tests using Xcode 26 and iOS 26 simulator (#185431)" (flutter/flutter#185513)
2026-04-24 engine-flutter-autoroll@skia.org Roll Skia from e8d00d634c22 to ea20c73ac72c (8 revisions) (flutter/flutter#185500)
2026-04-23 okorohelijah@google.com Run all flutter/flutter macOS tests using Xcode 26 and iOS 26 simulator (flutter/flutter#185431)
2026-04-23 rmolivares@renzo-olivares.dev update team-text-input pr triage link to filter out "waiting for response" label (flutter/flutter#185499)
2026-04-23 jason-simmons@users.noreply.github.com Check for overflow when computing the pixel buffer size for an animated PNG frame (flutter/flutter#185442)
2026-04-23 reinar@crypt.ws Impeller: Recreate Vulkan transients on surface size change (flutter/flutter#185122)
2026-04-23 matt.kosarek@canonical.com Updating the windowing API for sized to content regular and dialog windows + removing the decorated flag (flutter/flutter#184977)
2026-04-23 engine-flutter-autoroll@skia.org Roll Dart SDK from 634991935e9a to 70665fc3fd2e (2 revisions) (flutter/flutter#185488)
2026-04-23 louisehsu@google.com Updating ios triage link (flutter/flutter#185437)
2026-04-23 34871572+gmackall@users.noreply.github.com Revert "Preprovision Android NDK for flavored builds and reuse matchi… (flutter/flutter#185439)
2026-04-23 1961493+harryterkelsen@users.noreply.github.com fix(web): Fix LateInitializationError in CkSurface and SkwasmSurface (flutter/flutter#185116)
2026-04-23 1961493+harryterkelsen@users.noreply.github.com [web] Implement stepped image downscaling for CanvasKit and Skwasm (flutter/flutter#184741)
2026-04-23 30870216+gaaclarke@users.noreply.github.com Made wide_gamut_macos only run on arm64 machines (flutter/flutter#185486)
2026-04-23 chris@bracken.jp [ios] Update documentation for FlutterAppDelegate.pluginRegistrant (flutter/flutter#185201)
2026-04-23 engine-flutter-autoroll@skia.org Roll Dart SDK from bdf48933f3cf to 634991935e9a (1 revision) (flutter/flutter#185462)
2026-04-23 engine-flutter-autoroll@skia.org Roll Skia from 5fe6162546b1 to e8d00d634c22 (3 revisions) (flutter/flutter#185459)
2026-04-23 engine-flutter-autoroll@skia.org Roll Skia from 0049c5d91b08 to 5fe6162546b1 (1 revision) (flutter/flutter#185455)
2026-04-23 engine-flutter-autoroll@skia.org Roll Dart SDK from 9648f446f131 to bdf48933f3cf (19 revisions) (flutter/flutter#185451)
2026-04-23 engine-flutter-autoroll@skia.org Roll Skia from 11640d1cbc5c to 0049c5d91b08 (11 revisions) (flutter/flutter#185453)
2026-04-23 ishaquehassan@gmail.com Add disposal guidance to CurvedAnimation and CurveTween docs (flutter/flutter#184569)
2026-04-23 ishaquehassan@gmail.com Add `clipBehavior` parameter to `AnimatedCrossFade` (flutter/flutter#184545)
2026-04-23 rmacnak@google.com [fuchsia] Ask for only VMEX, not ambient-replace-as-executable. (flutter/flutter#185099)
2026-04-23 47866232+chunhtai@users.noreply.github.com Unify SemanticUpdateBuilder API for web and non-web (flutter/flutter#185433)
2026-04-22 68919043+Istiak-Ahmed78@users.noreply.github.com Fix ImageInfo.isCloneOf tests by moving async work to setUp (flutter/flutter#185254)
2026-04-22 engine-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from UdpQnaP5eSaDZd3-i... to j3UCWZhWx7zSl9Asy... (flutter/flutter#185438)
2026-04-22 30870216+gaaclarke@users.noreply.github.com Adds script to run malioc locally (flutter/flutter#185371)
2026-04-22 47866232+chunhtai@users.noreply.github.com Add await mechanism to setClipboard in android_semantics_integration test (flutter/flutter#185428)
2026-04-22 43054281+camsim99@users.noreply.github.com Add ability to pass flags to `et run` (flutter/flutter#185109)
2026-04-22 47866232+chunhtai@users.noreply.github.com Add more guidelines for code review bot (flutter/flutter#185367)
2026-04-22 danny@tuppeny.com Roll pub packages (flutter/flutter#185274)
2026-04-22 saurabhmirajkar000@gmail.com Fix incorrect scale parameter reference in Image constructor docs (flutter/flutter#185403)

If this roll has caused a breakage, revert this CL and stop the roller
using the controls here:
https://autoroll.skia.org/r/flutter-packages
...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CICD Run CI/CD engine flutter/engine related. See also e: labels. platform-ios iOS applications specifically team-ios Owned by iOS platform team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants