Flutter如何实现仅特定页面支持横屏 其余页面强制竖屏
实现方法
核心逻辑是全局默认锁竖屏,进入特定页面时放开横屏权限,离开页面时立刻恢复竖屏锁,具体操作如下:
- 全局初始化配置保留原有逻辑
在main函数启动时先设置全局默认方向,注意要先初始化Flutter绑定再调用方向设置接口,避免启动时生效延迟:
import 'package:flutter/services.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); // 全局默认仅允许竖屏 await SystemChrome.setPreferredOrientations([ DeviceOrientation.portraitUp, DeviceOrientation.portraitDown, ]); runApp(const MyApp()); }
- 特定横屏页面单独处理生命周期
需要支持横屏的页面必须用StatefulWidget,在初始化和销毁回调里分别修改方向配置:
// 这是需要支持横屏的页面 class SpecialPage extends StatefulWidget { const SpecialPage({super.key}); @override State<SpecialPage> createState() => _SpecialPageState(); } class _SpecialPageState extends State<SpecialPage> { @override void initState() { super.initState(); // 进入页面时放开横屏权限,按需传入需要支持的方向即可 SystemChrome.setPreferredOrientations([ DeviceOrientation.portraitUp, DeviceOrientation.portraitDown, DeviceOrientation.landscapeLeft, DeviceOrientation.landscapeRight, ]); // 如果要求进入这个页面就强制横屏,只保留横屏参数就行 // await SystemChrome.setPreferredOrientations([ // DeviceOrientation.landscapeLeft, // DeviceOrientation.landscapeRight, // ]); } @override void dispose() { // 离开页面时立刻恢复全局竖屏锁,保证后续页面不会意外支持横屏 SystemChrome.setPreferredOrientations([ DeviceOrientation.portraitUp, DeviceOrientation.portraitDown, ]); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('支持横屏的特殊页面')), // 其余页面内容 ); } }
- 注意事项
- 调用方向相关API必须先引入
package:flutter/services.dart依赖 - 部分机型上如果从横屏页面跳转其他普通竖屏页面偶现方向没切回,可以在普通竖屏页面的
initState里再执行一次竖屏配置,强制校正方向 - 调用
setPreferredOrientations建议加await等待配置生效,减少偶现的不生效问题
- 调用方向相关API必须先引入
内容的提问来源于stack exchange,提问作者user16304169
相关产品推荐
相关产品推荐

