You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter屏幕方向设置:平板与iPad支持横竖屏,小设备仅竖屏

实现Flutter设备方向适配:平板/iPad支持横竖屏,手机仅竖屏

要实现这种差异化的屏幕方向控制,核心是先识别设备类型,再针对性设置允许的显示方向,以下是具体实现方案:

方法一:通过屏幕尺寸阈值判断(无需额外依赖)

这种方法采用行业常用的600dp作为平板/手机分界阈值,通过屏幕最短边尺寸区分设备类型:

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 获取设备逻辑分辨率(去除设备像素比影响)
  final window = WidgetsBinding.instance.window;
  final screenSize = window.physicalSize / window.devicePixelRatio;
  final shortestSide = screenSize.shortestSide;
  
  // 定义平板判定阈值(可根据需求调整)
  const tabletThreshold = 600.0;
  List<DeviceOrientation> allowedOrientations;
  
  if (shortestSide >= tabletThreshold) {
    // 平板/iPad:允许所有横竖屏方向
    allowedOrientations = [
      DeviceOrientation.portraitUp,
      DeviceOrientation.portraitDown,
      DeviceOrientation.landscapeLeft,
      DeviceOrientation.landscapeRight,
    ];
  } else {
    // 手机:仅允许竖屏
    allowedOrientations = [DeviceOrientation.portraitUp];
  }
  
  await SystemChrome.setPreferredOrientations(allowedOrientations);
  
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('方向适配示例')),
        body: const Center(child: Text('根据设备类型自动适配方向')),
      ),
    );
  }
}

方法二:通过设备信息精准判断(需依赖device_info_plus)

如果需要明确区分iPad和大屏手机,可使用device_info_plus包获取设备硬件信息来精准判定:

步骤1:添加依赖

在pubspec.yaml中引入依赖:

dependencies:
  flutter:
    sdk: flutter
  device_info_plus: ^9.0.2

步骤2:实现代码

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:device_info_plus/device_info_plus.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  final deviceInfo = DeviceInfoPlugin();
  List<DeviceOrientation> allowedOrientations;
  
  // 分平台判断设备类型
  if (Theme.of(WidgetsBinding.instance.context).platform == TargetPlatform.iOS) {
    final iosInfo = await deviceInfo.iosInfo;
    if (iosInfo.model.contains('iPad')) {
      // iPad:允许全方向
      allowedOrientations = [
        DeviceOrientation.portraitUp,
        DeviceOrientation.portraitDown,
        DeviceOrientation.landscapeLeft,
        DeviceOrientation.landscapeRight,
      ];
    } else {
      // iPhone:仅竖屏
      allowedOrientations = [DeviceOrientation.portraitUp];
    }
  } else if (Theme.of(WidgetsBinding.instance.context).platform == TargetPlatform.android) {
    final androidInfo = await deviceInfo.androidInfo;
    if (androidInfo.isTablet ?? false) {
      // 安卓平板:允许全方向
      allowedOrientations = [
        DeviceOrientation.portraitUp,
        DeviceOrientation.portraitDown,
        DeviceOrientation.landscapeLeft,
        DeviceOrientation.landscapeRight,
      ];
    } else {
      // 安卓手机:仅竖屏
      allowedOrientations = [DeviceOrientation.portraitUp];
    }
  } else {
    // 其他平台默认仅竖屏
    allowedOrientations = [DeviceOrientation.portraitUp];
  }
  
  await SystemChrome.setPreferredOrientations(allowedOrientations);
  
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('方向适配示例')),
        body: const Center(child: Text('根据设备类型自动适配方向')),
      ),
    );
  }
}

平台配置注意事项

  • iOS端:需在Info.plist中声明支持的方向,否则代码设置无效:
    <key>UISupportedInterfaceOrientations</key>
    <array>
      <string>UIInterfaceOrientationPortrait</string>
      <string>UIInterfaceOrientationLandscapeLeft</string>
      <string>UIInterfaceOrientationLandscapeRight</string>
    </array>
    <key>UISupportedInterfaceOrientations~ipad</key>
    <array>
      <string>UIInterfaceOrientationPortrait</string>
      <string>UIInterfaceOrientationPortraitUpsideDown</string>
      <string>UIInterfaceOrientationLandscapeLeft</string>
      <string>UIInterfaceOrientationLandscapeRight</string>
    </array>
    
  • Android端:在AndroidManifest.xml的activity标签中设置动态方向支持:
    <activity
        android:name=".MainActivity"
        android:screenOrientation="sensor"
        ...>
    

内容的提问来源于stack exchange,提问作者Mohammed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 13:01:11