Flutter横屏实践

在这里插入图片描述

1、Flutter设置横屏

// 强制横屏
SystemChrome.setPreferredOrientations([
  DeviceOrientation.landscapeLeft,
  DeviceOrientation.landscapeRight
]);
// 强制竖屏
SystemChrome.setPreferredOrientations(
    [DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]);

另外建议

1、把所有横竖屏调用封装到一个方法中,便于维护

2、开启放super后面,关闭放super前面


void initState() {
  super.initState();
  AppUtil().setScreenLandscape(true);
}


void dispose() {
  AppUtil().setScreenLandscape(false);
  super.dispose();
}

2、原生设置横屏

在实践过程中发现ios偶尔有横屏转不过来的现象,如果你也遇到了可以考虑原生设置横屏。

android原生

if (screenLandscape) {
    // 设置屏幕为横向
   activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
} else {
    // 设置屏幕为纵向
    activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

如果需要相机、相册等系统应用也能横屏,可以打开允许自动旋转权限

// 检查是否打开自动屏幕旋转
public static boolean checkAutoRotate(Activity activity) {
    // android系统设置权限
    if (!Settings.System.canWrite(activity)) {
        activity.runOnUiThread(() -> Toast.makeText(activity, "请允许修改系统设置权限!", Toast.LENGTH_SHORT).show());
        // 没有系统设置权限 -> 跳转到系统设置页面
        new Thread(() -> {
            try {
                sleep(500);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
            intent.setData(Uri.parse("package:" + activity.getPackageName()));
            activity.startActivityForResult(intent, 1);
        }).start();
        return false;
    } else {
        // 有系统设置权限 -> 打开手机屏幕方向自动旋转(参数备注:1为开,0为关)
        Settings.System.putInt(activity.getContentResolver(), Settings.System.ACCELEROMETER_ROTATION, 1);
        return true;
    }
}

ios原生

NSDictionary *dict = call.arguments;
bool screenLandscape = [dict[@"screenLandscape"] boolValue];
UIInterfaceOrientation val = screenLandscape ? UIInterfaceOrientationLandscapeLeft : UIInterfaceOrientationPortrait;
[weakSelf ll_interfaceOrientation:val];
result([JYJUtils dictionaryToJson:@{}]);

3、横竖屏适配

横竖屏适配在flutter端实现,我这里只需要横屏,因此检测到竖屏会再次调用切换横屏

OrientationBuilder(
  builder: (context, orientation) {
    if (orientation == Orientation.portrait) {
      return PortraitPage();
    } else {
      return LandscapePage();
    }
  },
)

// 竖屏
PortraitPage() {
  AppUtil().setScreenLandscape(true);
  return Column(
    mainAxisSize: MainAxisSize.max,
    children: [
      CustomBar(
        title: _titleString(longTitle: true),
      ),
      Expanded(
        child: Center(
          child: Text('请旋转横屏使用'),
        ),
      ),
    ],
  );
}

// 横屏
LandscapePage() {
  final double statusBarHeight =
      Platform.isIOS ? 35 : MediaQuery.of(context).padding.top;
  return Container(
    margin: EdgeInsets.only(top: statusBarHeight, left: 30, right: 30),
  );
}

4、flutter 横屏android没有铺满

Screenshot_20231007_140001

解决办法
打开项目下android/app/src/main/res/values/styles.xml

添加

<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
        <item name="android:windowBackground">@drawable/launch_background</item>
    </style>
    <style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
        <item name="android:windowBackground">?android:colorBackground</item>
        <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
    </style>
</resources>LaunchTheme下为启动页配置,NormalTheme下为普通页面配置
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Flutter中,你可以通过设置幕方向来实现固定的横屏效果。你可以在Flutter代码中使用SystemChrome来实现这个功能。首先,你需要在你的Flutter项目中添加flutter/services库。然后,可以按照以下步骤来进行设置: 1. 导入flutter/services库: ```dart import 'package:flutter/services.dart'; ``` 2. 在你的Flutter App的入口函数(通常是main函数)中,使用SystemChrome来锁定幕方向为横屏: ```dart void main() { SystemChrome.setPreferredOrientations([ DeviceOrientation.landscapeLeft, DeviceOrientation.landscapeRight, ]); runApp(MyApp()); } ``` 上述代码将设置应用程序只能在横屏方向(左横屏和右横屏)上运行。 这样,当你启动你的Flutter App时,它将被锁定在横屏模式,并且不会根据设备的方向自动改变。 请注意,在Android和iOS上设置的幕方向可能有所不同。你可以根据需要自行调整设置。 希望这个解答能够帮到你!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Flutter中获取监听幕方向、锁定幕方向](https://blog.csdn.net/adojayfan/article/details/124590243)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流星雨在线

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值