Skip to content

[ios] Fix safe area padding not updating when SystemUiMode changes on iOS 26.0 and iOS 26.0.1#186028

Open
Akhrameev wants to merge 3 commits into
flutter:masterfrom
Akhrameev:fix/ios26-safe-area-status-bar-visibility
Open

[ios] Fix safe area padding not updating when SystemUiMode changes on iOS 26.0 and iOS 26.0.1#186028
Akhrameev wants to merge 3 commits into
flutter:masterfrom
Akhrameev:fix/ios26-safe-area-status-bar-visibility

Conversation

@Akhrameev

Copy link
Copy Markdown

On iOS 26, calling SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersive) no
longer updates MediaQuery.padding.top so the safe-area top padding stays at the
status-bar height even after the bar is hidden, so SafeArea leaves an unnecessary
gap at the top of the screen. The only previous workaround was to trigger a
rotation or resize.

Fixes #175520

Root cause

iOS 26 changed UIKit behavior: hiding the status bar via prefersStatusBarHidden
no longer triggers viewSafeAreaInsetsDidChange, and view.safeAreaInsets.top is
not reduced after the bar disappears. On earlier iOS versions UIKit updated the inset
synchronously; on iOS 26 the value is left stale.

Fix

setPrefersStatusBarHidden: capture statusBarManager.statusBarFrame.size.height
immediately before setting prefersStatusBarHidden = YES, while the frame is still
valid (it returns CGRectZero once the bar is gone). Then defer one run-loop via
dispatch_async so UIKit has committed the visibility change before
setViewportMetricsPaddings re-reads safeAreaInsets.

setViewportMetricsPaddings when the bar is hidden on iOS 26+, subtract the
captured height from safeAreaInsets.top to recover the true usable-area inset.
The correction is guarded by a 40 pt threshold that keeps it off notch/Dynamic Island
devices:

  • Non-notch status bars (iPad, iPhone SE) are ≤ 32 pt.
  • Notch / Dynamic Island bars are ≥ 44 pt (cutout-driven, must not be adjusted).
  • 40 pt sits safely in the gap between those two populations.

The entire new code path is inside if (@available(iOS 26.0, *)) so zero behavior
change on iOS 25 and below.

Tests

Two new ObjC unit tests in FlutterViewControllerTest:

Test iOS Expected
testSetViewportMetricsPaddings_subtractsStatusBarHeightOnNonNotchDevice 26+ 32 pt bar hidden → physical_padding_top corrected to 0
testSetViewportMetricsPaddings_preservesStatusBarPaddingOnNotchDevice all 47 pt (notch height) unchanged on hide

Manual end-to-end verification on iOS 26.0 simulators:

Device Type Result
iPad Pro 11-inch M4 non-notch padding 32 → 0 immediately on toggle ✓
iPhone 16e notch padding unchanged (no regression) ✓
iPhone 17 Pro Dynamic Island padding unchanged (no regression) ✓
iPhone 16 Pro iOS 18.6 Dynamic Island behavior unchanged (no regression) ✓

Pre-launch Checklist

@Akhrameev Akhrameev requested a review from a team as a code owner May 4, 2026 22:31
@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 May 4, 2026
@google-cla

google-cla Bot commented May 4, 2026

Copy link
Copy Markdown

Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

View this failed invocation of the CLA check for more information.

For the most up to date status, view the checks section at the bottom of the pull request.

@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 addresses an issue where safe area insets remain stale on non-notch iOS devices after the status bar is hidden. Targeting newer iOS versions, the implementation captures the status bar height before hiding, subtracts it from the top padding in viewport metrics, and schedules a layout pass to ensure the UI updates correctly. It also includes regression tests for both notch and non-notch scenarios. Review feedback identifies a redundant ivar declaration that is already synthesized by an existing property.

@Akhrameev Akhrameev force-pushed the fix/ios26-safe-area-status-bar-visibility branch from 4f05b24 to df5b886 Compare May 4, 2026 22:43
@LouiseHsu LouiseHsu added the CICD Run CI/CD label May 5, 2026
@Akhrameev

Copy link
Copy Markdown
Author

I was unable to test the fix in true iPad Split View (side-by-side multitasking) without a physical iPad.

In Split View, UIKit may ignore prefersStatusBarHidden and keep the status bar visible, while suggested fix would still subtract _statusBarHeightBeforeHiding from safeAreaInsets.top, incorrectly reporting padding.top = 0.

Could a reviewer with a physical iPad verify whether this case needs an additional guard? (or it's better to add it in advance without checks on my side?)

@Akhrameev

Akhrameev commented May 7, 2026

Copy link
Copy Markdown
Author

Note: Mac mac_unopt
Mac mac_unopt Completed in 63m — Mac mac_unopt failed because of timeout - can we somehow restart it?

@okorohelijah

Copy link
Copy Markdown
Contributor

@Akhrameev Can you provide a screenshot/video in the pr description for future reference?

@okorohelijah okorohelijah added the waiting for response The Flutter team cannot make further progress on this issue until the original reporter responds label May 7, 2026
@Akhrameev

Copy link
Copy Markdown
Author

Can you provide a screenshot/video in the pr description for future reference?

Just to be clear: do you want a video of original issue (it is already inside linked issue description) or a video or current (fixed) behavior? I can do both (even iPad Split View current behavior) but better have a list of states to cover to make you satisfied.

@github-actions github-actions Bot removed the waiting for response The Flutter team cannot make further progress on this issue until the original reporter responds label May 8, 2026
@Akhrameev

Copy link
Copy Markdown
Author

Here is flutter code I used to launch:

import 'dart:async';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

void main() {
  runApp(const MyApp());
}

// ── Device catalogue ─────────────────────────────────────────────────────────

enum _Category { dynamicIsland, notch, nonNotch, unknown }

class _DeviceInfo {
  const _DeviceInfo(this.name, this.category);
  final String name;
  final _Category category;
}

// Add new devices here. modelIdentifier → (display name, category).
// Obtain the identifier via:
//   xcrun simctl getenv <UDID> SIMULATOR_MODEL_IDENTIFIER
const _knownDevices = <String, _DeviceInfo>{
  // ── Dynamic Island ────────────────────────────────────────────────────────
  'iPhone15,2': _DeviceInfo('iPhone 14 Pro', _Category.dynamicIsland),
  'iPhone15,3': _DeviceInfo('iPhone 14 Pro Max', _Category.dynamicIsland),
  'iPhone16,1': _DeviceInfo('iPhone 15 Pro', _Category.dynamicIsland),
  'iPhone16,2': _DeviceInfo('iPhone 15 Pro Max', _Category.dynamicIsland),
  'iPhone17,1': _DeviceInfo('iPhone 16 Pro', _Category.dynamicIsland),
  'iPhone17,2': _DeviceInfo('iPhone 16 Pro Max', _Category.dynamicIsland),
  'iPhone17,3': _DeviceInfo('iPhone 16', _Category.dynamicIsland),
  'iPhone17,4': _DeviceInfo('iPhone 16 Plus', _Category.dynamicIsland),
  'iPhone18,1': _DeviceInfo('iPhone 17 Pro', _Category.dynamicIsland),
  'iPhone18,2': _DeviceInfo('iPhone 17 Pro Max', _Category.dynamicIsland),
  'iPhone18,3': _DeviceInfo('iPhone 17', _Category.dynamicIsland),
  'iPhone18,4': _DeviceInfo('iPhone 17 Plus', _Category.dynamicIsland),
  // ── Notch ─────────────────────────────────────────────────────────────────
  'iPhone10,3': _DeviceInfo('iPhone X', _Category.notch),
  'iPhone10,6': _DeviceInfo('iPhone X', _Category.notch),
  'iPhone11,2': _DeviceInfo('iPhone XS', _Category.notch),
  'iPhone11,4': _DeviceInfo('iPhone XS Max', _Category.notch),
  'iPhone11,6': _DeviceInfo('iPhone XS Max', _Category.notch),
  'iPhone11,8': _DeviceInfo('iPhone XR', _Category.notch),
  'iPhone12,1': _DeviceInfo('iPhone 11', _Category.notch),
  'iPhone12,3': _DeviceInfo('iPhone 11 Pro', _Category.notch),
  'iPhone12,5': _DeviceInfo('iPhone 11 Pro Max', _Category.notch),
  'iPhone12,8': _DeviceInfo('iPhone SE (2nd gen)', _Category.notch),
  'iPhone13,1': _DeviceInfo('iPhone 12 mini', _Category.notch),
  'iPhone13,2': _DeviceInfo('iPhone 12', _Category.notch),
  'iPhone13,3': _DeviceInfo('iPhone 12 Pro', _Category.notch),
  'iPhone13,4': _DeviceInfo('iPhone 12 Pro Max', _Category.notch),
  'iPhone14,2': _DeviceInfo('iPhone 13 Pro', _Category.notch),
  'iPhone14,3': _DeviceInfo('iPhone 13 Pro Max', _Category.notch),
  'iPhone14,4': _DeviceInfo('iPhone 13 mini', _Category.notch),
  'iPhone14,5': _DeviceInfo('iPhone 13', _Category.notch),
  'iPhone14,6': _DeviceInfo('iPhone SE (3rd gen)', _Category.notch),
  'iPhone14,7': _DeviceInfo('iPhone 14', _Category.notch),
  'iPhone14,8': _DeviceInfo('iPhone 14 Plus', _Category.notch),
  'iPhone15,4': _DeviceInfo('iPhone 15', _Category.notch),
  'iPhone15,5': _DeviceInfo('iPhone 15 Plus', _Category.notch),
  'iPhone17,5': _DeviceInfo('iPhone 16e', _Category.notch),
  // ── Non-notch (iPad Face ID, home-button-less) ─────────────────────────────
  'iPad13,4': _DeviceInfo('iPad Pro 11-inch (3rd gen)', _Category.nonNotch),
  'iPad13,5': _DeviceInfo('iPad Pro 11-inch (3rd gen)', _Category.nonNotch),
  'iPad13,6': _DeviceInfo('iPad Pro 11-inch (3rd gen)', _Category.nonNotch),
  'iPad13,7': _DeviceInfo('iPad Pro 11-inch (3rd gen)', _Category.nonNotch),
  'iPad14,3': _DeviceInfo('iPad Pro 11-inch (M2)', _Category.nonNotch),
  'iPad14,4': _DeviceInfo('iPad Pro 11-inch (M2)', _Category.nonNotch),
  'iPad16,3': _DeviceInfo('iPad Pro 11-inch (M4)', _Category.nonNotch),
  'iPad16,4': _DeviceInfo('iPad Pro 11-inch (M4)', _Category.nonNotch),
  'iPad16,5': _DeviceInfo('iPad Pro 13-inch (M4)', _Category.nonNotch),
  'iPad16,6': _DeviceInfo('iPad Pro 13-inch (M4)', _Category.nonNotch),
};

String _categoryLabel(_Category c) => switch (c) {
      _Category.dynamicIsland => 'Hardware cutout (Dynamic Island)',
      _Category.notch => 'Hardware cutout (Notch)',
      _Category.nonNotch => 'Non-notch',
      _Category.unknown => 'Unknown',
    };

String _expectedBehavior(_Category c) => switch (c) {
      _Category.dynamicIsland =>
        'Top padding stays at Dynamic Island clearance height\n'
            '(hardware cutout always requires clearance)',
      _Category.notch =>
        'Top padding stays at notch clearance height\n'
            '(hardware cutout always requires clearance)',
      _Category.nonNotch =>
        'Top padding drops to 0 in immersive mode\n'
            '(no hardware cutout, only status bar required clearance)',
      _Category.unknown =>
        'Add this device to one of the three lists\n'
            'in main.dart to see adjusted expectations',
    };

// ─────────────────────────────────────────────────────────────────────────────

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Status Bar Demo',
      debugShowCheckedModeBanner: false,
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  bool _isImmersive = false;
  Timer? _autoTimer;

  late final String _modelId;
  late final _DeviceInfo _deviceInfo;

  @override
  void initState() {
    super.initState();
    _modelId = const String.fromEnvironment('MODEL_ID');
    _deviceInfo = _knownDevices[_modelId] ??
        const _DeviceInfo('Unknown', _Category.unknown);

    _autoTimer = Timer.periodic(const Duration(seconds: 2), (_) => _toggle());
  }

  @override
  void dispose() {
    _autoTimer?.cancel();
    super.dispose();
  }

  void _toggle() {
    if (_isImmersive) {
      SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);
    } else {
      SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersive);
    }
    setState(() => _isImmersive = !_isImmersive);
  }

  @override
  Widget build(BuildContext context) {
    final padding = MediaQuery.of(context).padding;
    final osVersion = Platform.operatingSystemVersion;
    final category = _categoryLabel(_deviceInfo.category);
    final expected = _expectedBehavior(_deviceInfo.category);

    return Scaffold(
      body: SafeArea(
        child: Container(
          width: double.infinity,
          height: double.infinity,
          color: Colors.grey[300],
          child: Column(
            spacing: 8,
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text(
                'Immersive mode: $_isImmersive',
                style: const TextStyle(fontSize: 18),
              ),
              Text(
                'Safe area padding top: ${padding.top}',
                style: const TextStyle(fontSize: 18),
              ),
              Text(
                'Safe area padding bottom: ${padding.bottom}',
                style: const TextStyle(fontSize: 18),
              ),
              FilledButton(onPressed: _toggle, child: const Text('Toggle')),
              const SizedBox(height: 8),
              Padding(
                padding: const EdgeInsets.symmetric(horizontal: 24),
                child: Text(
                  'Device: ${_deviceInfo.name} ($_modelId)',
                  textAlign: TextAlign.center,
                  style: const TextStyle(fontSize: 13, color: Colors.black54),
                ),
              ),
              Padding(
                padding: const EdgeInsets.symmetric(horizontal: 24),
                child: Text(
                  'iOS $osVersion',
                  textAlign: TextAlign.center,
                  style: const TextStyle(fontSize: 13, color: Colors.black54),
                ),
              ),
              Padding(
                padding: const EdgeInsets.symmetric(horizontal: 24),
                child: Text(
                  'Category: $category',
                  textAlign: TextAlign.center,
                  style: const TextStyle(fontSize: 13, color: Colors.black54),
                ),
              ),
              const SizedBox(height: 4),
              Padding(
                padding: const EdgeInsets.symmetric(horizontal: 24),
                child: Text(
                  'Expected: $expected',
                  textAlign: TextAlign.center,
                  style: const TextStyle(
                    fontSize: 13,
                    color: Colors.black87,
                    fontStyle: FontStyle.italic,
                  ),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

@Akhrameev

Copy link
Copy Markdown
Author

iOS 18.6, match earlier behavior of stable flutter (recorded using fixed flutter in branch - almost no code changes here because of @available(iOS 26.0, *) guard in execution flow).

All three device categories behave as expected on iOS 18:

  • Hardware cutout (Dynamic Island / Notch): top padding stays at the hardware clearance height regardless of status bar visibility
  • Non-notch (iPad): top padding correctly drops to 0 in immersive mode
iphone16pro_ios18_status_bar_safe_area_fix.mp4
iphone16e_ios18_status_bar_safe_area_fix.mp4
ipadpro11m4_ios18_status_bar_safe_area_fix.mp4

@Akhrameev

Copy link
Copy Markdown
Author

iOS 26.0 - fixed behavior (fixes non-notch iPad, keeping other devices still correct)

Same correct behavior is now reproduced on iOS 26:

  • Hardware cutout devices (Dynamic Island, Notch): top padding stays consistent — matches the iOS 18 baseline ✓
  • Non-notch (iPad): top padding correctly drops to 0 in immersive mode — this was broken before the fix ✓
iphone17pro_ios26_status_bar_safe_area_fix.mp4
iphone16e_ios26_status_bar_safe_area_fix.mp4
ipadpro11m4_ios26_status_bar_safe_area_fix.mp4

@Akhrameev

Copy link
Copy Markdown
Author

@okorohelijah is that what you asked for?

@Akhrameev

Copy link
Copy Markdown
Author

Is there anything I can help to move the fix forward? "Update branch"?

@LouiseHsu LouiseHsu added CICD Run CI/CD and removed CICD Run CI/CD labels May 12, 2026
@fluttergithubbot

Copy link
Copy Markdown
Contributor

An existing Git SHA, 3f6e51b3647598959b10d9597794db1cbffc2794, was detected, and no actions were taken.

To re-trigger presubmits after closing or re-opeing a PR, or pushing a HEAD commit (i.e. with --force) that already was pushed before, push a blank commit (git commit --allow-empty -m "Trigger Build") or rebase to continue.

@Akhrameev Akhrameev force-pushed the fix/ios26-safe-area-status-bar-visibility branch from 3f6e51b to 5a4921c Compare May 13, 2026 13:46
@github-actions github-actions Bot removed the CICD Run CI/CD label May 13, 2026
@Akhrameev

Copy link
Copy Markdown
Author

rebased on top of master branch and ran tests locally: everything is still fine

@okorohelijah

Copy link
Copy Markdown
Contributor

cc @hellohuanlin

@okorohelijah okorohelijah added the CICD Run CI/CD label May 13, 2026

@LouiseHsu LouiseHsu 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.

this looks really good! i just have some minor nits/questions

// are <=32pt. 40pt sits safely in the gap between them.
// See: https://github.com/flutter/flutter/issues/175520
constexpr CGFloat kNotchStatusBarThreshold = 40.0;
if (self.flutterPrefersStatusBarHidden && _statusBarHeightBeforeHiding > 0 &&

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.

you noted in one of the comments that youre not sure about iPad Split View, and UIKit might ignore prefersStatusBarHidden. What do you think about checking statusbarHidden first?https://developer.apple.com/documentation/uikit/uistatusbarmanager/isstatusbarhidden?language=objc

[self setNeedsStatusBarAppearanceUpdate];
if (@available(iOS 26.0, *)) {
// On iOS 26+, setNeedsStatusBarAppearanceUpdate no longer triggers
// viewSafeAreaInsetsDidChange. Schedule a layout pass so

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.

nit:
// Schedule a layout pass so that viewDidLayoutSubviews invokes
// setViewportMetricsPaddings, which will then read the updated
// flutterPrefersStatusBarHidden state.

// updated flutterPrefersStatusBarHidden state.
// See: https://github.com/flutter/flutter/issues/175520
dispatch_async(dispatch_get_main_queue(), ^{
[self.view setNeedsLayout];

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.

can this be invoked before the view is loaded? maybe

[self.viewIfLoaded setNeedsLayout]; 

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

nice catch! I applied it twice and covered with a unit test (only sync way is tested - this dispatched flow change is not covered)

@Akhrameev Akhrameev force-pushed the fix/ios26-safe-area-status-bar-visibility branch from 5a4921c to d3f957b Compare May 14, 2026 10:44
@github-actions github-actions Bot removed the CICD Run CI/CD label May 14, 2026
@Akhrameev

Copy link
Copy Markdown
Author

ping me if I shall push rebased branch again (I've checked it: not merge conflicts, no tests get failed after rebase) - I am here to provide it when necessary

@Akhrameev

Copy link
Copy Markdown
Author

@vashworth is there anything I can do to move this MR forward? (I can rebase if needed - all local tests pass I've checked it recently)

@Akhrameev

Copy link
Copy Markdown
Author

@LouiseHsu @vashworth I see a green checkmark near "tree-status". Is it a great time to move my task forward? (rebased version was already checked by me and it passes all tests - ready to push if it is helpful).

@Akhrameev

Copy link
Copy Markdown
Author

just keeping you know that I am here and still checking a rebased version locally: it passes all tests and ready to push

@Akhrameev

Copy link
Copy Markdown
Author

tree-status is red again. 223 commits behind (no conflicts, locally rebased and re-tested again, still fine) - I guess it's time to push rebased version again

@Akhrameev Akhrameev force-pushed the fix/ios26-safe-area-status-bar-visibility branch from 2928968 to 8b65684 Compare June 10, 2026 09:21
@github-actions github-actions Bot removed the CICD Run CI/CD label Jun 10, 2026
@Akhrameev

Copy link
Copy Markdown
Author

@LouiseHsu @vashworth let's add CICD tag again. If there is anything I can help with, please let me know. (I've rechecked with current main branch locally - still no issues or merge conflicts)

@LouiseHsu LouiseHsu added the CICD Run CI/CD label Jun 11, 2026
@Akhrameev

Copy link
Copy Markdown
Author

@LouiseHsu am I right that "requested change" is not actual for this MR? ay least I have nothing obvious to do as "changes" here. P.S. Ready to push rebased local retested branch as always.

@leolabs

leolabs commented Jun 17, 2026

Copy link
Copy Markdown

@Akhrameev did you notice any change in this behavior for iOS 27?

@Akhrameev

Copy link
Copy Markdown
Author

@leolabs I re-verified this with video captures on official (published) Flutter 3.35.4 and Flutter 3.45.0-1.0.pre-590 (Framework revision f95820bde2
Engine revision 3c7f62c61cf50cd11aae94033881141c789d9ab1) and patched Flutter (rebased on recent main branch).

Behavior does not change and complete work correctly on iOS 27 for all types of devices.


On iOS 27.0 (tested: iPad Pro 13" M5 simulator, iPhone 17 Pro simulator, iPhone 17e simulator), I do not see this issue.

For the tested iOS 27.0 devices, behavior is correct even without my fix.

From my investigation, the problem appears specific to iOS 26.0 / 26.0.1.

I also tested iOS 26.1, 26.2, 26.4.1, and 27.0 — these behave correctly on official Flutter (and on patched as well).

@Akhrameev

Copy link
Copy Markdown
Author

Here are videos of unpatched flutter (I've recordered iPad non-notch only):

  • iOS 26.0.1
iPad_NonNotch_iOS26_0_1_official.mov
  • iOS 26.0
iPad_NonNotch_iOS26_0_official.mov

THEY BOTH HAVE THIS ISSUE

  • iOS 26.1
iPad_NonNotch_iOS26_1_official.mov
  • iOS 26.4.1
iPad_Pro_13_M5_iOS26_4_1_official.mov
  • iOS 27.0
iPad_Pro_13_M5_iOS27_0_official.mov

LAST THREE iOS VERSIONS BEHAVE CORRECT EVEN ON UNPATCHED FLUTTER

The same for Dynamic Island devices: they work correct on both versions.

@Akhrameev

Copy link
Copy Markdown
Author

Now patched version videos:

  • iOS 26.0.1
iPad_NonNotch_iOS26_0_1_patched.mov
  • iOS 26.0
iPad_NonNotch_iOS26_0_patched.mov
  • iOS 26.1
iPad_NonNotch_iOS26_1_patched.mov
  • iOS 26.4.1
iPad_Pro_13_M5_iOS26_4_1_patched.mov
  • iOS 27.0
iPad_Pro_13_M5_iOS27_0_patched.mov

NOW THEY ALL WORK CORRECTLY

Bonus:

  • iPhone 17 Pro (patched flutter)
iPhone_17_Pro_patched.mov
  • iPhone 17e (patched flutter)
iPhone_17e_patched.mov

ALSO CORRECT

@Akhrameev

Copy link
Copy Markdown
Author

One more thing I want to check is patched and unpatched flutter agains one more iOS 26.1 as there are two of them.

iOS 26.1 Simulator (23B86) was shown earlier. Now I am downloading iOS 26.1 Simulator (23B80).

Screenshot 2026-06-18 at 23 18 24

I expect that it will also be without this issue - even unpatched version.

@Akhrameev Akhrameev changed the title [ios] Fix safe area padding not updating when SystemUiMode changes on iOS 26 [ios] Fix safe area padding not updating when SystemUiMode changes on iOS 26.0 and iOS 26.0.1 Jun 18, 2026
@Akhrameev

Copy link
Copy Markdown
Author

updated MR title to be more precise about the scope of the issue

@Akhrameev

Akhrameev commented Jun 18, 2026

Copy link
Copy Markdown
Author

Mentioned Simulator is unavailable:

Domain: DVTDownloadableErrorDomain
Code: 32
User Info: {
    DVTErrorCreationDateKey = "2026-06-18 21:20:26 +0000";
}
--
CoreSimulator did not return status for the downloaded disk image.
Domain: DVTDownloadableErrorDomain
Code: 32
--


System Information

macOS Version 26.4.1 (Build 25E253)
Xcode 26.2 (24553) (Build 17C52)
Timestamp: 2026-06-19T01:20:26+04:00```

nothing to check from my side

@LouiseHsu LouiseHsu added CICD Run CI/CD and removed CICD Run CI/CD labels Jun 18, 2026
@fluttergithubbot

Copy link
Copy Markdown
Contributor

An existing Git SHA, 8b65684172afe6fd786aba71dc78873845589766, was detected, and no actions were taken.

To re-trigger presubmits after closing or re-opeing a PR, or pushing a HEAD commit (i.e. with --force) that already was pushed before, push a blank commit (git commit --allow-empty -m "Trigger Build") or rebase to continue.

@Akhrameev Akhrameev force-pushed the fix/ios26-safe-area-status-bar-visibility branch from 8b65684 to 639699d Compare June 19, 2026 10:19
@github-actions github-actions Bot removed the CICD Run CI/CD label Jun 19, 2026
@Akhrameev

Copy link
Copy Markdown
Author

I saw a fluttergithubbot comment and 151 commits in master branch. I've locally rebased on top of them - but did not yet publish updated version. So now it has all current master changes.

@Akhrameev

Copy link
Copy Markdown
Author

@LouiseHsu please re-add CICD tag (if needed)

@LouiseHsu LouiseHsu added the CICD Run CI/CD label Jun 25, 2026
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.

[iOS 26] Changing SystemUiMode doesn't change safe area

9 participants