Or try one:
The numbers
The Duo went on sale on 23 October 2026, running iOS 27.1. It opens like a book, so the inner screen's natural way round is landscape. All sizes are in points, read from the Xcode 27.1 simulator (build 27A9275).
| Cover screen | Inner screen | |
|---|---|---|
| Size | 466 x 678 | 951 x 669 (669 x 951 turned) |
| Size class | Compact width, like any iPhone | Regular x regular, like an iPad |
| Safe area (27.1 SDK, status bar shown) | 0 top, 84 right, 34 bottom | 0 top, 84 right, 34 bottom |
| Honors a portrait lock | Yes | No |
| Screenshot in simctl | --display=1 | --display=3 |
Your SDK decides whether the inner screen letterboxes you. Nothing in Info.plist changes it.
| Built with | What the inner screen shows |
|---|---|
| iOS 26 SDK (Xcode 26) | A phone-sized window, centered on black |
| iOS 27 SDK (Xcode 27.0) | Nearly full, keeping clear of the status bar |
| iOS 27.1 SDK (Xcode 27.1) | Edge to edge, status bar as a column on the right |
The iOS 27 SDK also requires the UIScene lifecycle. A build without UIApplicationSceneManifest in Info.plist doesn't launch. Flutter 3.47 migrates the Runner for you.
What broke in our apps
We ran our Flutter apps on the Duo simulator in October 2026. A Flutter app sees a fold as a resize and nothing else, so nearly every fault is one a widget test can catch. None of these failed a test we already had.
- No banner on the inner screen. Every app that asked for
getLargeAnchoredAdaptiveBannerAdSizeat the window width showed nothing unfolded. In one sweep, 35 of our 78 apps had the call. The fix is below. - The portrait lock was refused.
setPreferredOrientationsfails withUISceneErrorDomain Code=101 "The current windowing mode does not allow for programmatic changes to interface orientation."and the app runs at 951 x 669 anyway. Phone-only layouts put their buttons below the bottom edge, and a scroll view hid it from every test. - The app bar ran under the camera. With the 27.1 SDK the status bar is a column down the right edge, on the cover screen too. A Material
AppBarstill draws across the top. Apple's own apps moved their bar buttons into the right-hand column. - A disposed camera was drawn. A fold resizes the app while it is
inactive. The camera was released there, the next build drew the old controller, and Flutter threw “A CameraController was used after being disposed”. - A half-typed name vanished. On unfold the layout switched, the new lazy
ListViewstarted at the top, and it never built the focused text field. The keyboard closed and the text went with it. - A game world narrowed mid-round. Folding shrank the playfield from 620 to 481 units, and anything past the new edge could no longer be caught.
The checker above looks for the code shapes behind the first five. It reads text, so treat a clean result as a reason to open the simulator, not a pass.
The banner fix
Ask at the window's width as before, so iPads keep a wide banner. If that fails, ask once more at the short side, which is 669 unfolded and always fits. Then handle the fold both ways: drop a banner the window has become too narrow for, and drop one the window has outgrown by 100 points or more. We measured that second case on a Pixel Fold, where a banner asked for at 320 on the cover stayed 320 after reopening at 841.
static int requestWidth(Size window, {required bool narrowed}) =>
(narrowed ? window.shortestSide : window.width).truncate();
@override
void didChangeDependencies() {
super.didChangeDependencies();
final window = MediaQuery.sizeOf(context);
final ad = _bannerAd;
final tooWide = ad != null && ad.size.width > window.width;
final outgrown = ad != null && window.width > _askedAt + 100;
if (tooWide || outgrown) {
unawaited(ad.dispose());
_bannerAd = null;
}
_loadBannerAd(); // asks at requestWidth(window, narrowed: _narrowed)
}
// In the BannerAdListener:
onAdFailedToLoad: (ad, error) {
ad.dispose();
if (!_narrowed) {
_narrowed = true; // "Ad size will not fit on screen", code 0
_loadBannerAd();
}
},
Don't match on the error message, which Google can reword. Don't cap every request at 678 either: that shrinks iPad banners for no reason. Apps that already show the fixed 320 x 50 AdSize.banner in landscape windows are fine, since an unfolded Duo is a landscape window.
Two panes, not one stretched column
Unfolded, the Duo is a small landscape iPad. A phone column stretched across 951 points looks broken. Centered, it looks like a letterboxed app. Split list-and-detail screens into two panes at about 840 points of body width, with the list at 360 to 400 points on the left. Decide with LayoutBuilder, not MediaQuery, so each widget measures its own pane and not the window. Keep the selected item in one piece of state, so folding shows the same item on the cover screen. Leave single-job screens like a timer or a viewfinder whole.
The height is the short side, about 420 to 470 points once a bar and a banner are taken off, so let each pane scroll on its own.
Testing a fold
- Widget tests first. Pump at 466 x 678, do what a user does (type a name, start a round, open the camera), then resize to 951 x 669, to 669 x 951 and back. Assert where the buttons are, not just that nothing threw.
- Then the simulator. Install Xcode 27.1; 27.0 has no Duo simulator. The window is DeviceHub now, and the fold buttons are only there:
simctlhas no hinge command. Read the log for “Ad size will not fit on screen” and orientation errors. - On Flutter 3.44 with Xcode 27.1,
flutter build ios --simulatorfailed inlipofor us.flutter run -d <udid>,flutter driveand device builds still worked. - The simulator has no camera and no real hinge. Anything that depends on either is unverified until it runs on a phone.
Android foldables have the same faults
A Pixel Fold is 411 x 797 dp folded and 841 x 701 dp open. With targetSdk 36, Android 16 ignores a portrait lock on any display 600 dp or wider, which includes the inner screen, and API 37 removes the opt-out. Android does report the hinge in displayFeatures. On the emulator, adb emu fold changes the device state and adb shell wm size 884x2208 stands in for the outer screen. The banner that stays phone-sized after reopening showed up here first.
Where Flutter stands
Read on 31 October 2026. All four were open.
- #192515: fill in
MediaQuery.displayFeatureson iOS. Until it lands there is no hinge or posture in Flutter on a Duo. - PR #193025: the engine change that would fill them from the hinge and reserved regions.
- #193208: the text caret disappears after a fold.
- #193217: autocomplete suggestions disappear on a fold.
Pub packages that read the hinge over a platform channel have appeared (foldable, duo_motion, nitro_fold_duo). We haven't run them on a device. None of them is needed for an app that lays out correctly by width.
The cover screen is not open to other apps in any way Apple has documented. Don't plan a feature where someone across the table reads the outside screen.
Questions
Why is my AdMob banner not showing on iPhone Duo?
Google's Mobile Ads SDK refuses a banner wider than the device's main screen, and on the Duo the main screen is the 466-point cover screen. On the simulator, a 679-point banner loaded and a 680-point one failed with "Ad size will not fit on screen" (code 0). An app that asks for an adaptive banner at the full 951-point width of the unfolded window gets nothing. Retry once at the window's short side.
Why is my app letterboxed on the iPhone Duo?
Apple decides it from the SDK the app was built with, not from Info.plist. An iOS 26 SDK build shows as a centered phone window on the inner display. An iOS 27 SDK build nearly fills it. Only an iOS 27.1 SDK build, from Xcode 27.1, runs edge to edge.
What is the iPhone Duo screen size in points?
The cover screen is 466 x 678 points. The inner screen is 951 x 669 points held the usual way, which is landscape, and 669 x 951 turned. With the iOS 27.1 SDK and the status bar shown, the safe area is 0 top, 84 right and 34 bottom on both.
Does Flutter support the iPhone Duo?
It runs, and an app sees the fold as a resize. It sees nothing else: MediaQuery.displayFeatures is filled in on Android only, so there is no hinge or posture on iOS. Flutter issue #192515 and pull request #193025 are still open as of 31 October 2026. Lay out by width and the app works without them.
Can my app lock portrait on the iPhone Duo?
Only on the cover screen. The inner display ignores supported orientations, and a programmatic lock fails with UISceneErrorDomain Code=101. Every screen needs a layout that works in a 951 x 669 window.
Do I need iPhone Duo screenshots for the App Store?
Apple requires them on every submission from April 2027. Before then they are optional. App Store Connect's API calls the display type APP_IPHONE_DUO, and it accepted our landscape inner-screen shots at 2853 x 2007 pixels. fastlane deliver had no Duo type when we tried.
How do I fold the iPhone Duo simulator?
With the hinge buttons in DeviceHub, the window that replaced Simulator.app in Xcode 27.1. simctl has no hinge command. For a screenshot of each screen, pass --display=1 (cover) or --display=3 (inner) to xcrun simctl io screenshot.
More for app developers
The store listing checker scores an App Store or Play listing, and the app-ads.txt checker finds out why AdMob can't see your file. The casebook has the rejections we've hit and what fixed them, and our Claude Code skills run these checks on a whole app.