Flutter 颤振:如何防止设备方向改变和强制画像?

Flutter 颤振:如何防止设备方向改变和强制画像?,flutter,Flutter,我希望阻止我的应用程序更改其方向,并强制布局坚持“纵向” 在main.dart中,我将: void main(){ SystemChrome.setPreferredOrientations([ DeviceOrientation.portraitUp, DeviceOrientation.portraitDown ]); runApp(new MyApp()); } 但当我使用Android模拟器旋转按钮时,布局“遵循”了新设备的方向 我怎样才能解决这个问题 谢谢

我希望阻止我的应用程序更改其方向,并强制布局坚持“纵向”

在main.dart中,我将:

void main(){
  SystemChrome.setPreferredOrientations([
    DeviceOrientation.portraitUp,
    DeviceOrientation.portraitDown
  ]);
  runApp(new MyApp());
}
但当我使用Android模拟器旋转按钮时,布局“遵循”了新设备的方向

我怎样才能解决这个问题


谢谢

导入
软件包:flift/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月更新的颤振文档中所述,此解决方案可能不适用于某些IOS设备

他们建议通过如下方式在Info.plist中设置UISupportedInterfaceOrientations来固定方向

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

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

// This did not work as requirement
void main() {
  SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
  runApp(new MyApp());
}
您必须等待
设置首选项方向设置完成,然后
启动应用程序

网间网操作系统:
调用
SystemChrome.setPreferredOrientations()
对我不起作用,我必须按如下方式更改
设备方向:

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


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

  void main() {
  SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]).then((_) {
      runApp(new App());
    });
   }
此外,必须导入以下文件:


“package:flatter/services.dart”

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

import 'package:flutter/services.dart';
然后不要复制粘贴而是查看(记住)并在main.dart文件中编写以下代码

import 'package:flutter/services.dart';
要在纵向模式下强制:

void main() {
  SystemChrome.setPreferredOrientations(
      [DeviceOrientation.portraitUp,DeviceOrientation.portraitDown])
      .then((_) => runApp(MyApp()),
  );
   void main() {
      SystemChrome.setPreferredOrientations(
          [DeviceOrientation.landscapeLeft,DeviceOrientation.landscapeRight])
          .then((_) => runApp(MyApp()),
      );
要在横向模式下强制:

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

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

(正如Hejazi所说)

setPreferredOrientation
返回一个
未来
,因此它是异步的。最具可读性的方法是将
main
定义为异步:

Future main()异步{
等待SystemChrome.setPreferredOrientations([DeviceOrientation.GraphicUp]);
返回runApp(新的MyApp());
}

将WidgetsFlutterBinding.ensureInitialized()放入,否则在生成时会出现错误

import 'package:flutter/services.dart';

    void main() async => {
          WidgetsFlutterBinding.ensureInitialized();
          await SystemChrome.setPreferredOrientations(
              [DeviceOrientation.portraitUp],
          ); // To turn off landscape mode
          runApp(MainApp());
        };

从新的颤振版本开始,随着
首选方向的设置
我们需要增加一行,即

 WidgetsFlutterBinding.ensureInitialized();
因此,这方面的工作代码是-

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


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

导入“package:flatter/services.dart”

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

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

runApp(myApp());


下面是颤振团队的官方示例。


只需在main.dart文件中添加以下代码行

SystemChrome.setPreferredOrientations([
  DeviceOrientation.portraitUp,
]);
并记住导入services.dart文件。下面给出了一个例子

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

void main() {
    runApp(MyApp());
}


class MyApp extends StatelessWidget {
     @override
     Widget build(BuildContext context) {

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

      return MaterialApp(
        home: Scaffold(
          body: Center(child: Text("A Flutter Example!")),
     ),
   );
  }
}

如果您是从xcode界面编辑此内容,则不会对ipad进行更改。对于ipad部分,您必须从android studio编辑info.plist文件。你可以在数组列表中看到这样的“~ipad”。info.plist中有两个可用部分,您必须为iphone和ipad手动编辑它。

这个解决方案在两个不同的Android项目上对我都有效。不能保证它也能在iOS上运行。我已经阅读了前面的所有答案,我认为最好和最简单的解决方案是这样做:

<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">
安卓: 通过这种方式,您可以避免所有可能会干扰代码的“等待”、“异步”和“然后”

///这在main.dart中
main(){
WidgetsFlutterBinding.ensureInitialized();
runApp(
材料聚丙烯(
initialRoute:“/root”,
路线:{
“/root”:(上下文)=>MyApp(),
},
标题:“你的应用程序标题”,
),
);
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
///仅强制设备方向
SystemChrome.setPreferredOrientations([
DeviceOrientation.Up,
设备定向
]);
///运行应用程序
返回材料PP(
主页:主屏幕(),
);
}
}
网间网操作系统: 我认为这是你在iOS上的最佳选择

!!免责声明!! 我做了一点研究,显然,文件中明确指出:

setPreferredOrientations method Limitations:

"This setting will only be respected on iPad if multitasking is disabled."
这是如何从XCode禁用多任务(也称为打开“需要全屏”选项)的

iOS的另一个可能修复
你也可以试试。我没有亲自尝试过,因为我的电脑上没有iPad或XCode,但对于人们来说,值得一试,因为他们现在正在阅读这个问题。 这是我找到的最简单的方法,它在android和ios设备上都能工作

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

在iOS情况下,可以启用
要求全屏
选项

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

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

<key>UIRequiresFullScreen</key>
<true/>
UIRequiresFullScreen
这是一个简单的方法->

SystemChrome.setPreferredOrientations(
      [DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]);
android有两个选项

1。在主屏幕上写入

2。从本机上的
AndroidManifest.xml
文件设置

您还有两个iOS选项

1。从
info.plist

将此行添加到您的
信息中
    main() {
      WidgetsFlutterBinding.ensureInitialized();
      SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp])
          .then((_) {
        runApp(
          child: MyApp(),
        );
      });
}
<array>
    <string>UIInterfaceOrientationPortrait</string>
</array>