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

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

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,但它值得一试

其他回答

导入包:颤振/服务。飞镖,然后

放上SystemChrome。Widget build()方法中的setPreferredOrientations。

例子:

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

更新

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

他们建议通过在信息中设置UISupportedInterfaceOrientations来固定方向。请像这样

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

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

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

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

导入导入“包:flutter/services.dart”;

然后在main中包含下面这行代码。Dart文件,并在你的main方法中像这样:

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

runApp(myApp());

这是一个简单的方法->

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

android有两个选项

1. 写在主

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

2. 在AndroidManifest.xml文件中设置

iOS上也有两种选择

1. 从info.plist

将这一行添加到您的信息中。plist文件

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

2. 从跑步者 打开你的奔跑者。Xcode的iOS文件夹中的xcworkspace。点击Runner而不是Pods。您可以在“常规>部署信息”上找到此选项。看看你想要什么