用途:帮助 Flutter 应用适配 iPhone Duo(Apple 首款折叠 iPhone)。核心前提是 Flutter 的折叠抽象为 Android 设计,MediaQuery.displayFeatures 在 iPhone Duo 上始终返回空列表,dual_screen 包(TwoPane、hingeAngleEvents)实际仅支持 Android 且约三年未更新,因此开箱即无折叠感知能力。
主要能力(第一层,纯 Dart,无需原生代码):用 LayoutBuilder 与 BoxConstraints 驱动布局,避免缓存尺寸;用 MediaQuery.sizeOf(context) 而非 MediaQuery.of(context),减少重建;处理非对称安全区,MediaQuery.paddingOf 返回四边独立值,避免 width - padding.left * 2 这类对称假设,优先用 SafeArea;用宽度断点替代方向判断(Material 3 窗口尺寸类:compact < 600、medium 600–840、expanded ≥ 840 逻辑像素),不要依赖 Platform.isIOS、设备型号或 orientationOf;宽布局用 NavigationRail、窄布局用 NavigationBar。
第二层需平台通道:reservedRegions(kind:)(UIView)、UIHingeInteraction、traitCollection 的尺寸类。一次性查询用 MethodChannel,连续数据(铰链角度)用 EventChannel;在 Runner target 的 FlutterViewController 上注册通道,区域序列化为 {left, top, width, height, kind, active} 映射,变化时推送而非轮询;需对非折叠设备与 iOS 27.1 以下降级为“无区域、无铰链”,不可抛异常。
建议顺序:先让布局在 LayoutBuilder 下正确缩放,再审查 padding 对称计算,改用约束分支,加入 rail/bar 分栏,最后才写通道。限制:截至资料所述,尚无 Flutter 版本内置 iPhone Duo 支持;原生 API 需 iOS 27.1 与 Xcode 27.1 模拟器才能测试。