Flutter如何实现强制自动横竖屏切换 绕过设备方向锁定
Flutter无视系统方向锁实现自动横竖屏切换方案
该需求可在Android、iOS双端稳定实现,核心逻辑是绕过系统方向锁对旋转事件的拦截,由应用侧直接下发屏幕方向控制指令,不受系统方向锁开关状态影响
Android端实现逻辑
Android系统的方向锁仅拦截系统层面的重力感应旋转广播,不会限制应用主动调用Activity方向设置接口,实现步骤非常简单:
- 打开主项目的
android/app/src/main/AndroidManifest.xml文件,在主Activity的配置节点添加如下属性:
<activity android:name=".MainActivity" android:configChanges="orientation|screenSize|keyboardHidden" android:screenOrientation="fullSensor" <!-- 其余原有配置保持不变 --> >
- 在Flutter代码中引入
flutter/services.dart,需要开启自动旋转时直接调用:
SystemChrome.setPreferredOrientations([ DeviceOrientation.portraitUp, DeviceOrientation.portraitDown, DeviceOrientation.landscapeLeft, DeviceOrientation.landscapeRight, ]);
该调用会直接触发Activity层的方向设置,完全不受系统方向锁影响,设备会正常跟随重力感应在横竖屏间切换。如果需要固定为某一个方向,只传入对应方向的枚举值即可。
iOS端实现逻辑
iOS系统的方向锁会屏蔽系统原生派发的旋转事件,因此不能直接依赖Flutter框架层的方向设置接口,需要配合原生控制器的方向属性重写实现绕过:
- 打开
ios/Runner/Info.plist文件,先声明应用支持所有需要用到的屏幕方向,移除不必要的方向限制配置。 - 原生层重写当前
UIViewController的supportedInterfaceOrientations、preferredInterfaceOrientationForPresentation属性,接收到Flutter侧的方向切换指令时,直接返回目标方向并触发视图旋转,不需要依赖系统旋转事件。 - 不需要手写原生方法通道的话,可以直接接入社区维护的
auto_orientation插件,该插件底层已经封装好了上述逻辑,同时内置了重力传感器监听,开启自动旋转后会实时读取设备角度主动切换方向,完全无视系统方向锁状态。
注意事项
- 仅调用
SystemChrome.setPreferredOrientations无法在iOS端绕过方向锁,必须配合原生侧的强制方向设置逻辑才会生效。 - 该功能属于应用自主控制界面表现的常规能力,提交Google Play、App Store时不会触发合规拦截,不需要申请特殊权限。
- 分屏、小窗等特殊系统模式下,系统会强制限制应用窗口的显示方向,这类场景下的方向限制属于系统级规则,没有绕过空间。
内容的提问来源于stack exchange,提问作者Magnussen Dourado
相关产品推荐
相关产品推荐

