我想阻止我的应用程序改变其方向,并迫使布局坚持“纵向”。

大体上是这样。省道,我放:

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

但当我使用Android模拟器旋转按钮时,布局“遵循”新的设备方向…

我怎么解决这个问题呢?

谢谢


当前回答

这个解决方案已经在我的两个不同的Android项目中发挥了作用。不能保证它也适用于iOS。我已经阅读了之前所有的答案,我认为最好和最简单的解决方案是这样做的:

Android:

这样你就避免了所有的“await”,“async”和“then”,这些可能会扰乱你的代码

/// 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:

我认为这个答案的更新是iOS的最佳选择。

!! 免责声明! ! 我做了一点调查,显然,这里的文档特别说:

setPreferredOrientations method Limitations:

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

下面是如何在XCode中禁用多任务处理(也就是打开“要求全屏”选项)

iOS的另一个可能的解决方案

你也可以试试这个。我个人还没有尝试过,因为我的电脑上没有iPad或XCode,但它值得一试

其他回答

这个解决方案已经在我的两个不同的Android项目中发挥了作用。不能保证它也适用于iOS。我已经阅读了之前所有的答案,我认为最好和最简单的解决方案是这样做的:

Android:

这样你就避免了所有的“await”,“async”和“then”,这些可能会扰乱你的代码

/// 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:

我认为这个答案的更新是iOS的最佳选择。

!! 免责声明! ! 我做了一点调查,显然,这里的文档特别说:

setPreferredOrientations method Limitations:

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

下面是如何在XCode中禁用多任务处理(也就是打开“要求全屏”选项)

iOS的另一个可能的解决方案

你也可以试试这个。我个人还没有尝试过,因为我的电脑上没有iPad或XCode,但它值得一试

Try

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

你也可以在android manifest和ios info中更改屏幕方向设置。plist文件。

对于人们来说,他们现在正在读这个问题。 这是我发现的最简单的方法,在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())));
      });
    }

要在iPad中强制竖屏,你还必须修改关键的UISupportedInterfaceOrientations~ iPad in ios/Runner/Info.plist:

    <key>UISupportedInterfaceOrientations~ipad</key>
    <array>
            <string>UIInterfaceOrientationPortrait</string>
            <string>UIInterfaceOrientationPortraitUpsideDown</string>
    </array>

这也可以通过XCode实现。

以上将在本地工作。为了通过XCode上传到App Store,你还需要将以下内容添加到Info.plist。这也可以通过检查“目标->常规->部署信息”下的“要求全屏”来完成。

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

否则你会在上传时得到一个错误。