Flutter 屏幕旋转适配

作者:Bowen_Jin日期:2026/6/3

1mindmap
2  root((Flutter 屏幕旋转适配))
3    原理
4      旋转手机 = 窗口尺寸变了
5      Flutter 检测到  自动重新布局
6    怎么监听
7      OrientationBuilder 根据横竖屏切布局
8      MediaQuery.sizeOf 根据宽度切布局 更推荐
9    怎么锁定屏幕
10      SystemChrome.setPreferredOrientations
11      锁定竖屏 portraitUp
12      锁定横屏 landscapeLeft Right
13      恢复自动 DeviceOrientation.values
14    安卓 vs iOS
15      Android 一行代码搞定
16      iOS 要多配置 3 
17        Info.plist 声明支持方向
18        AppDelegate 写回调动态控制
19        ViewController 也会参与判断
20    视频全屏实战
21      进全屏  切横屏
22      退出全屏  切回竖屏
23      iOS 需要额外在 AppDelegate 里配合
24

在移动开发中,屏幕旋转是非常常见的场景。

例如:

  • 视频播放器全屏播放
  • 平板横屏适配
  • 表单页面横竖屏切换
  • 折叠屏展开与收起

Flutter 已提供了完整的横竖屏支持。

本文将从实际开发角度介绍:

  • 如何监听屏幕旋转
  • 如何适配横竖屏布局
  • 如何锁定横屏或竖屏
  • Android 与 iOS 的区别,尤其是 iOS 特别要注意的地方

什么是屏幕旋转

当用户旋转手机时:

1设备方向变化
2      
3系统更新窗口尺寸
4      
5Flutter 重新布局
6      
7Widget 重新构建
8

因此:

Flutter 屏幕旋转本质上是窗口尺寸变化后的重新布局过程。


使用 OrientationBuilder 监听方向变化

Flutter 官方推荐使用:

1OrientationBuilder(builder: (context, orientation) {
2    return orientation == Orientation.portrait ? const PortraitPage()
3        : const LandscapePage();
4  },
5);
6

效果:

  • 竖屏显示 PortraitPage
  • 横屏显示 LandscapePage

实现横竖屏不同布局

例如商品列表页面:

竖屏:

12列 Grid
2

横屏:

13列 Grid
2

代码:

1OrientationBuilder(builder: (context, orientation) {
2  return GridView.count(rossAxisCount: orientation == Orientation.portrait ? 2 : 3);
3  },
4);
5

使用 MediaQuery 获取方向

除了 OrientationBuilder。

还可以直接获取方向:

1final orientation = MediaQuery.orientationOf(context);
2

判断:

1if (orientation == Orientation.landscape) {
2  print('横屏');
3}
4

使用 MediaQuery 获取屏幕尺寸

实际开发中更推荐:

1final size = MediaQuery.sizeOf(context);
2

例如:

1final width = MediaQuery.sizeOf(context).width;
2

根据宽度决定布局:

1if (width > 600) {
2  return TabletPage();
3}
4
5return MobilePage();
6

相比 Orientation。

这种方式更适合:

  • 平板
  • 折叠屏
  • 多窗口

场景。


OrientationBuilder 和 MediaQuery 的区别

方式作用
OrientationBuilder根据方向切换布局
MediaQuery.orientationOf获取当前方向
MediaQuery.sizeOf获取屏幕尺寸(推荐)

Flutter 官方建议:

1优先根据 Size 设计布局
2而不是只依赖 Orientation
3

因为大屏设备和折叠屏场景下:

1方向不变
2
3尺寸也可能变化
4

锁定竖屏

很多 App 会禁止横屏。

实现方式:

1void main() async {
2  WidgetsFlutterBinding.ensureInitialized();
3
4  await SystemChrome.setPreferredOrientations([
5    DeviceOrientation.portraitUp,
6  ]);
7
8  runApp(const MyApp());
9}
10

锁定横屏

例如:

  • 视频播放器
  • 游戏
  • 车机应用

代码:

1await SystemChrome.setPreferredOrientations([
2  DeviceOrientation.landscapeLeft,
3  DeviceOrientation.landscapeRight,
4]);
5

恢复自动旋转

1await SystemChrome.setPreferredOrientations(
2  DeviceOrientation.values,
3);
4

恢复系统默认行为。


Android 与 iOS 的区别

为什么

1SystemChrome.setPreferredOrientations(...)
2

Android 可以正常工作。

但 iOS 经常不生效

原因是Android 和 iOS 的方向管理机制完全不同


Android

Android 中:

1SystemChrome.setPreferredOrientations(...)
2

Flutter 最终会调用 Android 原生:

1Activity.setRequestedOrientation()
2

请求系统切换方向。App一般能够正确旋转方向

因此大多数 Flutter 项目不需要编写 Android 原生代码 只使用 Flutter API 即可。


iOS

iOS 不一样。 很多人以为:

1SystemChrome.setPreferredOrientations(...)
2

就能直接控制方向。

实际上 Flutter 只是向系统提出请求

最终是否旋转由 UIKit 决定

Apple 官方文档也说明:

系统会综合判断:

  • App 支持哪些方向
  • 当前 ViewController 支持哪些方向
  • 当前 Window 支持哪些方向

来判断当前是否允许旋转。


iOS 配置 Info.plist

如果需要用户旋转手机屏幕 首页保持竖屏, 需要在 Info.plist 配置 Portrait

1<key>UISupportedInterfaceOrientations</key>
2<array>
3    <string>UIInterfaceOrientationPortrait</string>
4</array>
5

表示整个 App 默认只支持竖屏

那视频播放器为什么还能横屏

在 AppDelegate 实现如下回调: 例如:

1override func application(
2    _ application: UIApplication,
3    supportedInterfaceOrientationsFor window: UIWindow?
4) -> UIInterfaceOrientationMask {
5    return OrientationUtils.shared.orientationLock
6}
7

作用: 动态控制当前页面允许的方向

例如:

1首页
2
3Portrait
4
5视频页
6
7Landscape
8
9退出视频页, 返回其他页面
10
11Portrait
12

Apple 官方说明:

如果实现了这个方法。 系统会优先询问使用这里返回的方向,而不仅仅使用 Info.plist。


Flutter + iOS 常见方案

Info.plist

默认:

1Portrait
2

AppDelegate

动态控制:

1var orientationLock:
2UIInterfaceOrientationMask = .portrait
3

进入视频页:

1orientationLock = .landscape
2

退出视频页:

1orientationLock = .portrait
2

然后 Flutter 调用:

1SystemChrome.setPreferredOrientations(...)
2

完成横竖屏切换。

Android iOS 横竖屏切换总结

Android:

1Flutter 请求方向
2
3系统通常直接执行
4

iOS:

1Flutter 请求方向
2      
3Info.plist 判断
4      
5AppDelegate 判断(如果实现,覆盖Info.plist中条件)
6      
7ViewController 判断(和AppDelegate/Info.plist取交集)
8      
9UIKit 最终决定(交集结果)
10

因此:

  • Android 通常只需要 Flutter 代码;
  • iOS 除了 Flutter 代码外,还需要正确配置 Info.plist,还要通过 AppDelegate 动态控制横竖屏。

视频播放器横屏实战

进入全屏:

1await SystemChrome
2    .setPreferredOrientations([
3  DeviceOrientation.landscapeLeft,
4  DeviceOrientation.landscapeRight,
5]);
6

退出全屏:

1await SystemChrome
2    .setPreferredOrientations([
3  DeviceOrientation.portraitUp,
4]);
5

这是最常见的使用场景。


Flutter 屏幕旋转适配》 是转载文章,点击查看原文


相关推荐


HTML应用指南:利用GET请求获取智己汽车门店位置信息
图说交通2026/5/26

智己汽车作为高端智能电动汽车品牌,深度融合先锋设计美学、纯电驱动技术、高阶智能驾驶与全场景出行服务,依托L7、LS7、LS6、L6等产品矩阵,打造兼具科技感与驾控乐趣的高端出行体验。在营销推广层面,智己摒弃传统4S店模式,创新采用“体验中心+用户中心”的新零售策略,系统构建以用户旅程为核心的全域触点网络。 目前,品牌已在北京、上海、广州、深圳、杭州、成都、武汉、西安、南京、苏州、重庆等一线及新一线城市核心商圈布局直营体验中心与交付中心,并战略性入驻上海BFC外滩金融中心、北京侨福芳草地、深圳万


Scrapy 分布式爬虫:大规模采集汽车之家电车评论
小白学大数据2026/5/5

汽车之家电车评论包含车型体验、续航表现等关键信息,是产品分析与市场调研的核心数据源。单台机器运行Scrapy爬虫易触发反爬、效率低下,分布式爬虫通过多机器协同,可有效解决这一问题。本文将精简讲解Scrapy分布式爬虫的搭建、配置、开发及部署,附带完整可运行代码,助力开发者快速实现大规模评论采集。 一、核心技术栈与环境准备 搭建Scrapy分布式爬虫需多组件协同,核心配置如下: 1.1 核心技术选型 Scrapy:核心爬虫框架,负责请求、解析与调度,支持中间件扩展。Scrapy-Redis


散户如何使用手机T0算法?
韭菜修养2026/4/25

1、什么是T0算法?T0算法如何运作? 据记者了解,当前多家券商已在其APP中推出T0算法服务,旨在通过智能化交易工具帮助投资者捕捉日内波动收益,执行“低买高卖”策略,帮助投资者降低持仓成本或增厚收益。 T0算法,全称“日内交易算法”,是一种基于量化模型的自动化交易工具。其核心逻辑是通过实时分析市场数据(如价格、成交量、盘口信息等),在极短时间内捕捉股票日内波动产生的价差,执行“低买高卖”操作,从而帮助投资者降低持仓成本或增厚收益。   具体来说,算法会设定一系列的规则和指标,当市场价


深度解密 Rollup 插件开发:核心钩子函数全生命周期图鉴
发现一只大呆瓜2026/4/17

前言 Rollup 的强大在于其精简的插件系统。一个 Rollup 插件本质上就是一个包含各种“钩子函数”的对象。理解这些钩子的执行时序,是编写高性能插件、优化构建流程的关键。本文将带你深度复盘 Rollup 的两大核心阶段:构建 (Build) 与 输出 (Output) 。 一、构建阶段钩子函数(核心阶段) 构建阶段主要负责模块的解析、加载和转换,最终完成模块依赖图的构建,是Rollup打包的基础。该阶段可细分为5个小阶段,钩子执行顺序固定为: 初始化阶段(options、buildSta


记一次 OKE 集群上的 TCP 流量黑洞排查与解决全过程
小猿姐2026/4/9

作为 Apecloud 团队,我们致力于通过开源的 KubeBlocks 项目,在 Kubernetes (K8s) 上为用户提供企业级的数据库高可用方案[1]。其中,SQL Server on K8s with Always On 是我们支持的关键能力之一,相比Microsoft 为在容器中运行 SQL Server 提供的基础StatefulSet方案, KubeBlocks 的 MSSQL Addon 提供了一整套生产级的生命周期管理能力,包括:多节点高可用配置、动态扩缩容、数据库/账户管


Spring Boot 牵手Spring AI,玩转DeepSeek大模型
小码哥_常2026/4/1

Spring Boot 牵手Spring AI,玩转DeepSeek大模型 引言:开启 AI 集成之旅 在当今这个 AI 技术迅猛发展的时代,你是否想过如何将强大的大模型融入到我们日常的 Java 开发中,为应用赋予智能交互的能力呢?今天,我们就来探索如何通过 Spring Boot 集成 Spring AI,进而调用 DeepSeek 大模型,为你的项目注入全新的 AI 活力。这不仅能让你深入了解 AI 与后端开发融合的前沿技术,还能为你在实际项目中运用 AI 技术提供宝贵的经验 。接下来,就


OpenClaw实战|从识图到公众号内容自动化,我跑通了完整链路
后端小肥肠2026/3/23

大家好,我是小肥肠。今天这篇文章,想跟大家分享一下我最近刚跑通两个skill:让 OpenClaw图像理解和 飞书 文章一键转存至公众号草稿箱。 1. 前言 最近我在慢慢做一件事:把之前在 Coze 里折腾过的插件和工作流,陆续迁到 OpenClaw + Skill 这一套上。上周末我主要搞定了两件事,都已经不是“纸上谈兵”,是真的跑起来了。 第一件:把图像理解插件迁移成 OpenClaw Skill 我把之前做的图像理解Coze插件,迁成了一个独立的 xfc-img-understand sk


墨梅博客 1.9.0 发布与 LeanCloud 停服应对 | 2026 年第 11 周草梅周报
草梅友仁2026/3/15

本文在草梅友仁的博客发布和更新,并在多个平台同步发布。如有更新,以博客上的版本为准。您也可以通过文末的 原文链接 查看最新版本。 前言 欢迎来到草梅周报!这是一个由草梅友仁基于 AI 整理的周报,旨在为您提供最新的博客更新、GitHub 动态、个人动态和其他周刊文章推荐等内容。 开源动态 本周墨梅博客的开发依旧在稳步进行中。 您可以前往 Demo 站试用:demo.momei.app/ 您可以通过邮箱 admin@example.com,密码 momei123456 登录演示用管理员账号


ai-agent工程师指南
哈里谢顿2026/3/7

一些基本概念 1 Zero-shot & Few-shot 是什么? 1. Zero-shot(零样本) 不给例子,直接让模型做。 不提供任何参考样例 只告诉模型任务是什么 完全靠模型本身能力去理解、推理 例子 把下面句子分类成积极 / 消极:这部电影太好看了! 这就是 zero-shot。 2. Few-shot(少样本 / 小样本) 给几个例子,再让模型做。 给 1~10 个左右的示例 告诉模型:我要你像这样输出 模型照着格式、逻辑去做 例子 分类:今天心情很好 → 积极分类


CSDN创作变现活动!社区镜像或使用视频教程分别单个最高得 80 元,收益上不封顶!
CSDN官方博客2026/2/27

CSDN AI 社区是聚焦 AI 技术产业落地的开发者服务平台(官方入口),核心为创作者搭建技术价值转化桥梁,AI社区涵盖: 镜像市场(社区镜像)、算力市场等模块。 本次推出镜像创作激励活动,以下是方案活动规则、参与要求及激励政策,保障创作者权益与活动有序开展。 一、活动总则 活动时间: 2026年1月1日 - 2026年2月28日 现金奖励: 1、按照官方指定镜像任务创作,单个社区镜像奖励 30-80元现金 ,创作越多可获得现金奖

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 聚合阅读