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

时间:2018-03-21 23:48:08

标签: dart flutter

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

在main.dart中,我把:

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

但是当我使用Android模拟器旋转按钮时,布局“跟随”新的设备方向......

我怎么解决这个问题?

由于

20 个答案:

答案 0 :(得分:41)

导入newCString result,然后

package:flutter/services.dart放在SystemChrome.setPreferredOrientations方法中。

示例:

Widget build()

答案 1 :(得分:16)

@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() {
  SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp])
    .then((_) {
      runApp(new MyApp());
    });
}

答案 2 :(得分:14)

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

import 'package:flutter/services.dart';

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

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

          runApp(MainApp())
        };

答案 3 :(得分:7)

对于iOS,调用SystemChrome.setPreferredOrientations()对我不起作用,我不得不在Xcode project中进行更改。

enter image description here

答案 4 :(得分:5)

只需在main.dart文件中添加以下代码即可。

var jsonschema = root.json
var newjson = {}
for (let name in jsonschema) {
     if (jsonschema.children.length > 0 ) {
          //add a empty object to newjson
    }
}

,并记住导入services.dart文件。下面是一个例子!

SystemChrome.setPreferredOrientations([
  DeviceOrientation.portraitUp,
]);

答案 5 :(得分:4)

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

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

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

'package:flutter / services.dart'

答案 6 :(得分:4)

对于人们来说,他们正在阅读此问题。 我找到的最简单的方法可以在android和ios设备上使用。

 void main() {
  WidgetsFlutterBinding.ensureInitialized();
  SystemChrome.setPreferredOrientations(
    [
      DeviceOrientation.portraitUp,
      DeviceOrientation.portraitDown,
    ],
  ).then((val) {
    runApp(YourAppName());
  });
}

答案 7 :(得分:3)

下面是扑扑队的官方例子。 https://github.com/flutter/samples/blob/master/veggieseasons/lib/main.dart

import 'package:flutter/services.dart' show DeviceOrientation, SystemChrome;

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

答案 8 :(得分:1)

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

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

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

runApp(myApp());

答案 9 :(得分:1)

从新的flutter版本以及设置preferred Orientation开始,我们需要增加一行,即

 WidgetsFlutterBinding.ensureInitialized();

因此,适用的代码是-

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

答案 10 :(得分:1)

打开android / app / src / main / AndroidManifest.xml并更新此

T

使用此代码

<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">

它将适用于android。对于iOS,您可以从此页面的Xcode进行更改 https://i.stack.imgur.com/hswoe.png

答案 11 :(得分:0)

尝试

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

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

答案 12 :(得分:0)

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

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

答案 13 :(得分:0)

如果您正在xcode界面中进行编辑,则不会为ipad更改它。对于ipad部分,您必须从android studio中编辑info.plist文件。您可以在阵列列表中看到类似的“〜ipad”。 info.plist中有两个部分,您必须为iPhone和iPad手动对其进行编辑。

答案 14 :(得分:0)

此解决方案对我来说适用于两个不同的Android项目。无法保证它也适用于iOS。我已经阅读了所有先前的答案,并且我认为最好和最简单的解决方案是这样做:

Android:

这样,您可以避免所有可能会弄乱代码的“等待”,“异步”和“然后”

/// this is in main.dart

main(){
  WidgetsFlutterBinding.ensureInitialized();

  runApp(
    MaterialApp(
      initialRoute: '/root',
      routes: {
        '/root': (context) => MyApp(),
      },
      title: "Your App Title",
    ),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    /// ENFORCE DEVICE ORIENTATION PORTRAIT ONLY
    SystemChrome.setPreferredOrientations([
      DeviceOrientation.portraitUp,
      DeviceOrientation.portraitDown
    ]);

    /// RUN THE APP
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

iOS:

我认为this answer's update是iOS的最佳选择。

!免责声明! 我做了一些研究,显然文档here特别指出:

setPreferredOrientations method Limitations:

"This setting will only be respected on iPad if multitasking is disabled."

Here是如何从XCode禁用多任务处理(又称为“需要全屏显示”选项)

iOS的另一个可能的修复程序

您也可以尝试this one。我还没有亲自尝试过,因为我的PC上没有iPad或XCode,但是值得一试

答案 15 :(得分:0)

在iOS情况下可以启用requires fullscreen选项。

void main() async {
      WidgetsFlutterBinding.ensureInitialized();
      SystemChrome.setPreferredOrientations([
        DeviceOrientation.landscapeRight,
        DeviceOrientation.landscapeLeft,
      ]).then((_) {
        runApp(MediaQuery(
            data: MediaQueryData(),
            child:
                MaterialApp(debugShowCheckedModeBanner: false, home: LoginPage())));
      });
    }

enter image description here

答案 16 :(得分:0)

要使 SystemChrome.setPreferredOrientations 在 iPad 上运行,请在 Xcode 项目编辑器中启用“需要全屏”,或者只需在项目文件夹的 /ios/Runner/Info.plist 中添加以下行。

<key>UIRequiresFullScreen</key>
<true/>

答案 17 :(得分:0)

这个方法很简单->

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

答案 18 :(得分:0)

<块引用>

Android 有两种选择

1.写在主要

    main() {
      WidgetsFlutterBinding.ensureInitialized();
      SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp])
          .then((_) {
        runApp(
          child: MyApp(),
        );
      });
}

2.从本地设置 AndroidManifest.xml 文件 enter image description here

<块引用>

iOS 也有两种选择

1.来自info.plist

将此行添加到您的 info.plist 文件

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

2.来自跑步者 从 Xcode 上的 iOS 文件夹打开您的 Runner.xcworkspace。单击 Runner 而不是 Pods。您可以在 General>Deployment Info 上找到此选项。只是检查你想要什么 enter image description here

答案 19 :(得分:-4)

最好的解决方案是在MyApp()的构建方法中使用它。