颤振:如何防止设备方向改变并强制肖像?


123

我想防止我的应用程序更改其方向,并强制布局坚持“肖像”。

在main.dart中,我输入:

void main(){
  SystemChrome.setPreferredOrientations([
    DeviceOrientation.portraitUp,
    DeviceOrientation.portraitDown
  ]);
  runApp(new MyApp());
}

但是当我使用Android Simulator的旋转按钮时,布局“遵循”新设备的方向...

我该如何解决?

谢谢


4
假设您导入了'package:flutter/services.dart',则可能是一个错误:github.com/flutter/flutter/issues/13238
Brian Kung

不知道为什么会这样。我尝试在仿真器以及我自己的设备上运行您的代码,但效果很好。
Hemanth Raj

SystemChrome.setPreferredOrientations异步返回,因此似乎runApp应该包含在中then

Answers:


189

导入package:flutter/services.dart,然后

SystemChrome.setPreferredOrientations里面的Widget build()方法。

例:

  class MyApp extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
      SystemChrome.setPreferredOrientations([
        DeviceOrientation.portraitUp,
        DeviceOrientation.portraitDown,
      ]);
      return new MaterialApp(...);
    }
  }

更新资料

如2019年10月更新的flutter文档中所述,此解决方案可能不适用于某些IOS设备。

他们建议通过像这样在Info.plist中设置UISupportedInterfaceOrientations来固定方向

<array>
    <string>UIInterfaceOrientationPortrait</string>
</array>

有关更多信息https://github.com/flutter/flutter/issues/27235#issuecomment-508995063


工作了 谢谢<3
Suthura Sudharaka

1
如果将SystemChrome.setPreferredOrientations放在主目录中,则会收到错误:初始化绑定之前已访问ServicesBinding.defaultBinaryMessenger。将代码插入到构建中是可行的,因为绑定已在此时进行了初始化。
金狮

76

@boeledi,如果您想“锁定”设备的方向并不允许其随着用户旋转手机而改变,则可以轻松地进行以下设置,

// This did not work as requirement
void main() {
  SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
  runApp(new MyApp());
}

您必须等到setPreferredOrientations完成后再启动应用

// This will works always for lock screen Orientation.
void main() {
  WidgetsFlutterBinding.ensureInitialized();
  SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp])
    .then((_) {
      runApp(new MyApp());
    });
}

有时在编译时会引发错误,您应该使用本机解决方案。在Amaner Iqbal的建议下,在AndroidManifest的MainActivity上添加“ android:screenOrientation =“ portrait”“对我有效。
Tincho825

44

iOS:

调用SystemChrome.setPreferredOrientations()对我不起作用,我不得不按如下所示Device OrientationXcode项目中更改:

在此处输入图片说明

Android:

将文件中主要活动的screenOrientation属性设置为,如下所示:portraitandroid/app/src/main/AndroidManifest.xml

在此处输入图片说明


我遇到了同样的问题,您是否在iPad上运行它?我只在iPad上进行过测试,这似乎是个问题:github.com/flutter/flutter/issues/27235
Boy

机器人:这个属性在API级别24.添加
BloodLoss

我使用的screenOrientation是Android的API级别8。@BloodLoss,我想您在文档中阅读了它,但是关于resizeableActivity属性。再次检查链接。^^
Erick M. Sprengel

22

setPreferredOrientations方法返回一个Future对象。每个文档中,“ Future”代表将来将在某处可用的某些价值。这就是为什么您要等到它可用后再继续使用该应用程序。因此,应使用'then'方法,根据定义,该方法“注册在Future完成时要调用的回调”。因此,您应使用以下代码:

  void main() {
  SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]).then((_) {
      runApp(new App());
    });
   }

另外,必须导入以下文件:

``package:flutter / services.dart''


我可以确认这项工作。但是,当函数没有参数时,请使用whenComplete()而不是then()。
Csaba Gergely

20

打开android / app / src / main / AndroidManifest.xml并在MainActivity中添加以下行:

android:screenOrientation="portrait"

如果您有这个:

<activity
        android:name=".MainActivity"
        android:launchMode="singleTop"
        android:theme="@style/LaunchTheme"
        android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
        android:hardwareAccelerated="true"
        android:windowSoftInputMode="adjustResize">

您应该以如下形式结束:

<activity
        android:name=".MainActivity"
        android:launchMode="singleTop"
        android:theme="@style/LaunchTheme"
        android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
        android:hardwareAccelerated="true"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="adjustResize">

这适用于Android。在iOS上,您必须从Xcode页面进行更改:https ://i.stack.imgur.com/hswoe.png(如Hejazi所说)


谢谢,记住configChanges“ orientation”之后“ portrait”的顺序很重要。
MR_AMDEV

13

首先将其导入main.dart文件中

import 'package:flutter/services.dart';

然后不要复制粘贴,而是看(记住)并在main.dart文件中编写以下代码

强制以纵向模式:

void main() {
  SystemChrome.setPreferredOrientations(
      [DeviceOrientation.portraitUp,DeviceOrientation.portraitDown])
      .then((_) => runApp(MyApp()),
  );

要强制使用横向模式:

   void main() {
      SystemChrome.setPreferredOrientations(
          [DeviceOrientation.landscapeLeft,DeviceOrientation.landscapeRight])
          .then((_) => runApp(MyApp()),
      );

1
谢谢你的提醒人们不要盲目复制粘贴
莱恩

1
我明白了为什么您要不要复制粘贴...缺少结尾} ...我复制粘贴了... :)
rohan koshti

颤振铬没有工作
金狮

13

将WidgetsFlutterBinding.ensureInitialized()放入,否则在构建时会出现错误。

import 'package:flutter/services.dart';

    void main() async => {
          WidgetsFlutterBinding.ensureInitialized(),

          await SystemChrome.setPreferredOrientations(
              [DeviceOrientation.portraitUp]), // To turn off landscape mode

          runApp(MainApp())
        };

5

setPreferredOrientation返回Future<void>,因此它是异步的。最易读的方法是定义main为异步:

Future<void> main() async {
  await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
  return runApp(new MyApp());
}

3
我非常不同意。await是一种存在于多种语言中的无处不在的编程模式,非常清楚的是它具有什么表现力。then创建嵌套级别。如果您有3个或4个延续,then确实开始变得非常难以阅读。
罗伯·林登

.then可以链接,而不是像期望的那样嵌套FutureOr。这使我可以使用更具功能性的方法,这种方法更具可读性和优雅性。例如,通过链接“ thens”,我可以使用表达式主体而不是方括号主体。
Mateus Felipe

有时在编译时会引发错误,您应该使用本机解决方案。在Amaner Iqbal的建议下,在AndroidManifest的MainActivity上添加“ android:screenOrientation =“ portrait”“对我有效。
Tincho825

如果遇到错误:“未处理的异常:在初始化绑定之前已访问ServicesBinding.defaultBinaryMessenger。” 尝试使用此修复程序:stackoverflow.com/questions/57689492/...
Fillipe席尔瓦

1

对于新的flutter版本以及设置,preferred Orientation我们需要添加一条额外的行,即

 WidgetsFlutterBinding.ensureInitialized();

所以工作代码是-

import 'package:flutter/services.dart';
    void main() {
          WidgetsFlutterBinding.ensureInitialized();
          SystemChrome.setPreferredOrientations([
            DeviceOrientation.portraitUp,
            DeviceOrientation.portraitDown
          ]);
          runApp(MyApp());
        }


0

尝试

 void main() async {
      WidgetsFlutterBinding.ensureInitialized();
      await SystemChrome.setPreferredOrientations(
          [DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]); 
    
      runApp(MyApp());
 }

您还可以在android清单和ios info.plist文件中更改屏幕方向设置。


0

导入导入'package:flutter / services.dart';

然后,将以下代码行包含在main.dart文件和main方法中,如下所示:

WidgetsFlutterBinding.ensureInitialized();
  SystemChrome.setPreferredOrientations([
    DeviceOrientation.portraitDown,
    DeviceOrientation.portraitUp,
  ]);

runApp(myApp());

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.