Predidit/Kazumi

按键全屏和设备方向全屏的冲突问题

Open

#712 建立於 2025年2月10日

在 GitHub 查看
 (1 留言) (2 反應) (0 負責人)Dart (726 fork)batch import
bughelp wanted

倉庫指標

Star
 (25,154 star)
PR 合併指標
 (平均合併 6天 19小時) (30 天內合併 22 個 PR)

描述

issue 内容

一直以来使用按键进行横竖屏切换后就无法使用旋转手机的方法进行横竖屏切换,关于这个问题我大致有一点想法

手机端全屏采用的方法是 setPreferredOrientations,这个函数的作用是设置设备 允许的 的旋转方向,也就是设置后设备只能在所设置的几种方向上进行切换,按键全屏设置为了 landscapeLeft 和 landscapeRight,那么设备就无法切换至 portraitUp

https://github.com/Predidit/Kazumi/blob/8c095ad8e6163ddabffa1c9dbf258f6f4db4f978/lib/utils/utils.dart#L442-L447

如果在设置横屏后立即解除旋转限制可以解决这个问题。

https://github.com/Predidit/Kazumi/blob/8c095ad8e6163ddabffa1c9dbf258f6f4db4f978/lib/utils/utils.dart#L462-L465

但是考虑常见用户行为:按下全屏键后手机还是竖直状态,这就会导致横屏后会立即旋转回竖屏,全屏按键约等于没生效

鸿蒙在 API 12 引入了新的 Orientation 枚举类型 USER_ROTATION_PORTRAIT 和 USER_ROTATION_LANDSCAPE,描述如下

ohos 的 SystemChrome.setPreferredOrientations 不知道为什么不生效,所以一直需要用 native 侧代码实现横竖屏切换

在 ohos 的 native 侧用这两个枚举类型进行横竖屏切换操作可以保证在下一次用户切换设备旋转方向前一直保持设定状态。不过由于 OrientationBuilder 会一直调用 Utils 中的横竖屏代码,所以 ohos 在设备旋转到 landscapeRight 的方向时会再次旋转到 landscapeLeft

如果我们可以找到办法在 dart 或者安卓和 iOS 上实现相同的效果也许就能解决按键全屏和设备方向全屏的冲突问题

提交前确认

  • issue 列表中,没有我的新功能需求 / 问题

貢獻者指南