TrendForce, Apple'ın yıl sonuna kadar iPhone Duo'dan yaklaşık 5 milyon birim sevk edeceğini öngörüyor — 1.999 dolarlık başlangıç fiyatına rağmen katlanabilir pazarının neredeyse dörtte biri. Bu rakam tek başına küçük görünebilir; ama o cihazı alan kullanıcı, katlama anında uygulamanızın ne yaptığına bakarak karar veriyor.
TrendForce expects Apple to ship roughly 5 million iPhone Duo units by the end of the year — nearly a quarter of the foldable market, despite the $1,999 entry price. That number may look small on its own, but the people buying that device judge your app by watching what it does the moment they unfold it.
01iPhone Duo kısaca: dört poseiPhone Duo in brief: four poses
Book-style bir katlanabilir: kapalıyken 5,4 inç dış ekran, açıkken 7,6 inç iç ekran. Apple'ın farkı, iki ekranın birbirine yakın en-boy oranı paylaşması — içerik geçişi bu sayede daha akıcı.
A book-style foldable: a 5.4-inch cover display when closed, a 7.6-inch inner display when open. Apple's twist is that the two screens share a close aspect ratio, which makes content carry across the transition more smoothly.
Uygulamanızın karşılaşacağı dört pose var:
Your app will meet four poses:
- Kapalı, dikey — sıradan bir iPhone gibi davranır.
- Closed, portrait — behaves like an ordinary iPhone.
- Kapalı, yatay — dar ama geniş; en çok sıkıştırılan hâl.
- Closed, landscape — short but wide; the most cramped case.
- Açık, dikey — iPad'e yakın bir oran.
- Open, portrait — close to iPad proportions.
- Açık, yatay — geniş, neredeyse kare.
- Open, landscape — wide, almost square.
Kritik nokta şu: geçişler uygulama kapalıyken olmuyor. Kullanıcı uygulamanın içindeyken katlama hareketini yapıyor; uygulama o anda hem yeni form faktörüne uyum sağlamak hem de durum bilgisini (scroll pozisyonu, form içeriği, açık modal) korumak zorunda.
The critical part: these transitions do not happen while the app is closed. The user folds the device while inside your app, so it has to adapt to the new form factor and preserve state — scroll position, form contents, an open modal — at the same moment.
02Toplulukta ne konuşuluyor?What the community is saying
GitHub — flutter/flutter #192515. Duyuruyla neredeyse eş zamanlı açılan bu issue, Flutter'ın iPhone Duo için fold farkındalığı olmadığını teknik detaylarıyla ortaya koyuyor. MediaQuery.displayFeatures yalnızca Android embedder'ında, Jetpack WindowManager üzerinden populate ediliyor; iPhone Duo'da cihaz ne kadar katlanırsa katlansın liste boş dönüyor. Issue, Apple'ın iOS 27.1'de getirdiği reserved-region API'lerini Darwin embedder'da ViewportMetrics yoluyla Flutter'ın DisplayFeature soyutlamasına bağlamayı öneriyor.
GitHub — flutter/flutter #192515. Opened almost simultaneously with the announcement, this issue lays out in technical detail that Flutter has no fold awareness for iPhone Duo. MediaQuery.displayFeatures is populated only in the Android embedder, from Jetpack WindowManager; on iPhone Duo the list comes back empty no matter how folded the device is. The proposal is to plumb the reserved-region APIs Apple added in iOS 27.1 through ViewportMetrics in the Darwin embedder into Flutter's DisplayFeature abstraction.
Issue aynı zamanda Flutter'ın modelindeki daha derin bir boşluğa da parmak basıyor: iOS'ta "bu cihazda bir katlama var mı — şu an düz olsa bile?" diye sorabiliyorsunuz. Apple'ın önerisi, katlaması olan bir cihazda grid kolon sayısını çift tutmak; böylece kullanıcı her büktüğünde layout yeniden dizilmiyor. Flutter'ın modeli bunu ifade edemiyor — aktif olmayan bir özellik listede hiç yok; yani düz bir iPhone Duo ile sıradan bir iPhone 18 aynı görünüyor.
The issue also points at a deeper gap in Flutter's model: on iOS you can ask "does this device have a fold, even though it is flat right now?" Apple's guidance is to keep grid column counts even on a device with a fold, so the layout does not reshuffle every time the user bends it. Flutter's model cannot express that — an inactive feature simply is not in the list, so a flat iPhone Duo looks identical to a plain iPhone 18.
Genel topluluk sesi. Yazılan içeriklerin ezici çoğunluğu Swift/UIKit perspektifinden; Flutter özelinde kaynak hâlâ kısıtlı. Kötü haber: resmi Flutter desteği yok ve React Native'de durum daha kötü (hiçbir fold API'si yok). İyi haber: uygulamalar çökmüyor ve doğru yazılmış adaptive layout'lar büyük ölçüde çalışıyor.
The wider community. The overwhelming majority of what has been written comes from a Swift/UIKit perspective; Flutter-specific material is still thin. The bad news: there is no official Flutter support, and React Native is worse off (no fold API at all). The good news: apps do not crash, and well-written adaptive layouts largely just work.
03Flutter'da gerçek durumWhere Flutter actually stands
Bugün Flutter'dan bekleyemeyeceklerinizWhat you cannot expect from Flutter today
MediaQuery.displayFeatures iOS'ta boş geliyor. Uygulamanız katlanma konumunu, katlama bölgesinin ekrandaki yerini ya da cihazın açık/kapalı/yarı açık olduğunu Flutter altyapısıyla doğrudan bilemiyor.
MediaQuery.displayFeatures comes back empty on iOS. Your app cannot directly know, through Flutter's own plumbing, the fold posture, where the fold sits on screen, or whether the device is open, closed or half-open.
// iPhone Duo'da her zaman boş liste döner// Always returns an empty list on iPhone Duo final features = MediaQuery.of(context).displayFeatures; // features.isEmpty == true — cihaz hangi pose'da olursa olsun// features.isEmpty == true — whatever pose the device is in
dual_screen paketi bir çözüm değil. Microsoft'un Surface Duo döneminde geliştirdiği bu paket Android-only ve yıllardır güncellenmedi. iPhone Duo için hiçbir katkısı yok.
The dual_screen package is not the answer. Built by Microsoft in the Surface Duo era, it is Android-only and has not been updated in years. It contributes nothing for iPhone Duo.
Halihazırda çalışanlarWhat already works
LayoutBuilder yeniden boyutlandırmayı doğru hallediyor. Kullanıcı telefonu açtığında callback tetikleniyor ve layout yeniden hesaplanıyor. Fold'un nerede olduğunu bilmiyorsunuz, ama ne kadar alanınız olduğunu biliyorsunuz — ki pratikte kararların çoğu buna dayanıyor.
LayoutBuilder handles the resize correctly. Unfolding fires the callback and the layout is recomputed. You do not know where the fold is, but you do know how much space you have — which is what most decisions actually hinge on.
MediaQuery.paddingOf(context) asimetrik safe area'ları zaten ayrı ayrı veriyor. iPhone Duo'da sistem kontrolleri bir tarafa kaydığı için sol ve sağ inset'ler eşit değil — Flutter bunu native olarak destekliyor.
MediaQuery.paddingOf(context) already reports asymmetric safe areas separately. On iPhone Duo the system controls shift to one side, so left and right insets differ — Flutter supports this natively.
Tablet breakpoint'leriniz zaten doğru layoutu seçiyor. İç ekran açıldığında her iki boyutta da regular size class'a sahip — iPad genişliğinde. Halihazırda bir tablet layout'u olan Flutter uygulaması açık modda makul görünecek.
Your tablet breakpoints already pick the right layout. Opened, the inner display has a regular size class in both dimensions — iPad width. A Flutter app that already has a tablet layout will look reasonable unfolded.
04Layout'u nasıl düşünmeli?How to think about layout
iPhone Duo, yıllardır sorduğumuz soruyu geçersiz kılıyor: "portrait mı, landscape mı?" Doğru soru artık tek: elimdeki alan ne kadar?
iPhone Duo invalidates the question we have asked for years: "portrait or landscape?" There is only one right question now: how much space do I have?
// ❌ Yanlış: orientation'a göre dallanmak — iç ekran kilidi yoksayıyor// ❌ Wrong: branching on orientation — the inner display ignores the lock if (MediaQuery.of(context).orientation == Orientation.portrait) { return CompactLayout(); } // ✅ Doğru: fiziksel alanı ölçerek karar vermek// ✅ Right: decide by measuring the space you actually have return LayoutBuilder( builder: (context, constraints) { if (constraints.maxWidth >= 600) return WideLayout(); return CompactLayout(); }, );
setPreferredOrientations'ı bırakınDrop setPreferredOrientations
En yaygın ve en sessiz sorun bu. Portrait kilidi varsa iPhone Duo'nun iç ekranı onu yoksayıyor ve uygulama letterbox moduna giriyor — 7,6 inçlik ekranın ortasında siyah bantlarla çevrili bir telefon uygulaması. Kullanıcının 1.999 dolar verdiği cihazda gördüğü ilk izlenim bu oluyor.
This is the most common and quietest failure. With a portrait lock in place, iPhone Duo's inner display ignores it and the app drops into letterbox mode — a phone app framed by black bars in the middle of a 7.6-inch screen. That is the first impression on a device someone paid $1,999 for.
// ❌ Letterbox'a neden olur// ❌ Causes letterboxing SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); // ✅ Layout kararını LayoutBuilder'a bırakın// ✅ Leave the layout decision to LayoutBuilder SystemChrome.setPreferredOrientations([]);
MediaQuery.sizeOf — doğru yerde çağırınMediaQuery.sizeOf — call it in the right place
Boyut bilgisini initState'de saklarsanız katlama anında güncellenmez; ekran değişir, değişkeniniz değişmez.
Cache the size in initState and it will not update when the device folds; the screen changes, your variable does not.
// ❌ Katlama sonrası bayat kalır// ❌ Goes stale after a fold void initState() { screenSize = MediaQuery.of(context).size; } // ✅ Her katlama değişiminde yeniden tetiklenir// ✅ Re-triggers on every fold change Widget build(BuildContext context) { final size = MediaQuery.sizeOf(context); }
Asimetrik safe areaAsymmetric safe areas
iPhone Duo'da sol ve sağ inset'lerin eşit olmadığını varsayın. Tek taraflı bir ölçümü ikiyle çarpan her hesap burada yanlış sonuç veriyor.
Assume left and right insets are not equal on iPhone Duo. Any calculation that doubles a single-side measurement produces the wrong answer here.
// ❌ Hatalı// ❌ Wrong final usableWidth = size.width - padding.left * 2; // ✅ Doğru// ✅ Right final usableWidth = size.width - padding.left - padding.right;
05Katlama tespiti: platform channel köprüsüDetecting the fold: a platform channel bridge
Flutter resmi destek sunana kadar Apple'ın reservedRegions API'sine platform channel üzerinden erişebilirsiniz. iOS 27.1'de UIView üzerindeki reservedRegions(kind:), her bölge için bir frame, bir tür ve aktif/pasif durum döndürüyor. Katlama bölgesinin türü .division.
Until Flutter ships official support, you can reach Apple's reservedRegions API through a platform channel. In iOS 27.1, reservedRegions(kind:) on UIView returns a frame, a kind and an active/inactive state per region. The fold's kind is .division.
if #available(iOS 27.1, *) { let channel = FlutterMethodChannel( name: "com.yourapp/iphone_duo", binaryMessenger: flutterViewController.binaryMessenger ) channel.setMethodCallHandler { call, result in if call.method == "getFoldRegions" { guard let view = flutterViewController.view else { result([]); return } // .division = katlama bölgesi// .division = the fold region let regions = view.reservedRegions(kind: .division).map { ["x": $0.frame.origin.x, "y": $0.frame.origin.y, "width": $0.frame.size.width, "height": $0.frame.size.height, "isActive": $0.isActive] as [String: Any] } result(regions) } } }
class IPhoneDuoBridge { static const _channel = MethodChannel('com.yourapp/iphone_duo'); static Future<List<FoldRegion>> getFoldRegions() async { try { final List<dynamic> raw = await _channel.invokeMethod('getFoldRegions'); return raw.map((r) => FoldRegion.fromMap(Map<String, dynamic>.from(r))).toList(); } catch (_) { return []; // Android ya da iOS 27.1 öncesi// Android, or pre-iOS 27.1 } } }
isActive: false döndüğünde cihaz düz demek: katlama bölgesi sıfır genişliğe sahip ve layout'u etkilemiyor. Buradaki asıl kazanç, bölgenin varlığını öğrenmek — cihazda bir katlama olduğunu bildiğiniz anda kolon sayısını çift tutmak gibi kararları önceden verebilirsiniz.
When isActive: false comes back, the device is flat: the fold region has zero width and does not affect layout. The real win here is learning that the region exists — once you know the device has a fold, you can make decisions like keeping column counts even up front.
06iOS SDK rebuild: küçük adım, büyük farkThe iOS SDK rebuild: small step, big difference
Tek satır kod yazmadan görünümü değiştiren tek şey: hangi SDK ile build aldığınız.
The one thing that changes how the app looks without writing a line of code: which SDK you built against.
| Build SDKBuild SDK | İç ekran davranışıInner display behaviour |
|---|---|
| Eski SDKOlder SDK | Letterbox — iki yanda siyah bantlar.Letterboxed — black bars on both sides. |
| iOS 27 SDK | Tam genişlik, ama status bar sola uzanıyor.Full width, but the status bar stretches to the left. |
| iOS 27.1 SDK | Tam kenardan kenara; navigasyon butonları dikey yerleşiyor.Properly edge to edge; navigation buttons lay out vertically. |
Xcode 27.1'e geçin ve rebuild edin. Aynı sürüm Device Hub üzerinden iPhone Duo simülatörünü de getiriyor: açma, kapama, döndürme ve katlama kontrolleriyle dört pose'u gerçek cihaza ihtiyaç duymadan test edebiliyorsunuz.
Move to Xcode 27.1 and rebuild. The same release brings the iPhone Duo simulator through Device Hub: open, close, rotate and fold controls let you exercise all four poses without a physical device.
07Kontrol listesiChecklist
- Xcode 27.1 + iOS 27.1 SDK ile rebuild edin.
- Rebuild with Xcode 27.1 and the iOS 27.1 SDK.
SystemChrome.setPreferredOrientationsçağrılarını kaldırın.- Remove your
SystemChrome.setPreferredOrientationscalls. - Orientation yerine
LayoutBuilderile karar verin. - Decide with
LayoutBuilderinstead of orientation. MediaQuery.sizeOf(context)yalnızcabuild()içinde çağrılsın.- Call
MediaQuery.sizeOf(context)only insidebuild(). - Safe area inset'lerini asimetrik ele alın.
- Treat safe area insets as asymmetric.
- 600px ve üzeri genişlikte iki kolon / sidebar layout sunun.
- Offer a two-column or sidebar layout at 600px and above.
- Xcode Device Hub'da dört pose'u ve aralarındaki geçişi test edin.
- Test all four poses — and the transitions between them — in Xcode Device Hub.
- Fold tespiti gerekiyorsa platform channel köprüsünü kurun.
- Build the platform channel bridge if you genuinely need fold detection.
08ÖzetIn summary
Uygulamanız iPhone Duo'da çökmüyor — ama kullanıcı telefonu açtığı anda layout'un ne yaptığı, uygulamanızın kalitesini orada yargılıyor. Flutter'ın resmi fold desteği henüz yok ve iOS tarafı beklemede. Buna karşılık gereken her şey — LayoutBuilder, MediaQuery, tablet breakpoint'leri — halihazırda elinizde; fold tespitini de platform channel ile bugün ekleyebilirsiniz.
Your app will not crash on iPhone Duo — but what the layout does the instant someone unfolds it is where your app's quality gets judged. Flutter has no official fold support yet and the iOS side is pending. Everything you actually need, though — LayoutBuilder, MediaQuery, tablet breakpoints — is already in your hands, and you can add fold detection through a platform channel today.
// Muhtemelen uygulamanızdaki en değerli tek satırlık düzeltme// Probably the highest-value one-line fix in your app SystemChrome.setPreferredOrientations([]); // portrait kilidini kaldır// drop the portrait lock
Bunu şimdi planlamak, 23 Ekim'den sonra acele etmekten çok daha ucuz. Mobil tarafta bu yıl planlanacak tek yapısal değişiklik de değil: Material ve Cupertino'nun SDK'dan ayrılması ve ajan uyumlu uygulama tasarımı aynı takvime giriyor.
Planning this now is far cheaper than rushing after 23 October. And it is not the only structural change to plan for on mobile this year: Material and Cupertino leaving the SDK and agent-ready app design land in the same window.
09Sık sorulanlarFrequently asked questions
Flutter uygulamam iPhone Duo'da çalışacak mı?Will my Flutter app run on iPhone Duo?
Evet, çalışıyor. Soru çalışıp çalışmaması değil, kullanıcı telefonu açtığında layout'un ne yaptığı. Doğru yazılmış adaptive layout'lar iç ekranda makul görünüyor; portrait kilidi olan ya da orientation'a göre dallanan uygulamalar letterbox moduna düşüyor.
Yes, it runs. The question is not whether it works but how the layout behaves when the user unfolds the device. Well-written adaptive layouts look reasonable on the inner display; apps with a portrait lock or orientation branching drop into letterbox mode.
MediaQuery.displayFeatures neden boş dönüyor?Why is MediaQuery.displayFeatures empty?
Çünkü yalnızca Android embedder'ında, Jetpack WindowManager üzerinden populate ediliyor. Darwin embedder'da karşılığı yok. flutter/flutter #192515 bunu iOS 27.1 reserved-region API'leriyle beslemeyi öneriyor; henüz resmi yanıt yok.
Because it is populated only in the Android embedder, from Jetpack WindowManager. The Darwin embedder has no equivalent. flutter/flutter #192515 proposes feeding it from the iOS 27.1 reserved-region APIs; there is no official response yet.
dual_screen paketini kullanabilir miyim?Can I use the dual_screen package?
Hayır. Android-only ve yıllardır güncellenmedi. iPhone Duo için bir katkısı yok; fold bilgisine bugün ulaşmanın tek yolu platform channel köprüsü.
No. It is Android-only and has not been updated in years. It contributes nothing for iPhone Duo; a platform channel bridge is the only route to fold information today.
Katlanmayı bugün tespit edebilir miyim?Can I detect the fold today?
Evet, ama Flutter'ın dışından. iOS 27.1'de UIView.reservedRegions(kind:) katlama bölgesini .division türüyle veriyor; cihaz düzken isActive false ve genişlik sıfır. Bunu FlutterMethodChannel ile Dart tarafına taşıyabilirsiniz.
Yes, but from outside Flutter. In iOS 27.1, UIView.reservedRegions(kind:) returns the fold as a .division region; while the device is flat, isActive is false and the width is zero. Carry it to Dart through a FlutterMethodChannel.
Gerçek cihaz olmadan test edebilir miyim?Can I test without a physical device?
Evet. Xcode 27.1, Device Hub üzerinden iPhone Duo simülatörünü içeriyor; açma, kapama, döndürme ve katlama kontrolleriyle dört pose'u ekranda deneyebiliyorsunuz.
Yes. Xcode 27.1 ships an iPhone Duo simulator through Device Hub, with open, close, rotate and fold controls so you can exercise all four poses on screen.
