颤振:如何防止设备方向变化和力画像?

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

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

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

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

我怎么解决这个问题呢?

谢谢

177309 次浏览

然后导入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设备。

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

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

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

@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());
});
}

iOS:

调用SystemChrome.setPreferredOrientations()对我不起作用,我必须更改Xcode项目中的Device Orientation,如下所示:

enter image description here

Android:

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

enter image description here

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

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

同时,还需要导入以下文件:

“包:颤振/ services.dart”

首先在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()),
);

打开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所说)

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

Future<void> main() async {
await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
return runApp(new 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());
};

对于新的flutter版本,在设置preferred Orientation的同时,我们需要添加额外的一行,即

 WidgetsFlutterBinding.ensureInitialized();

这个的工作代码是-

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

试一试

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

runApp(MyApp());
}

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

进口import 'package:flutter/services.dart';

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

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


runApp(myApp());


下面是颤振队的官方例子。 https://github.com/flutter/samples/blob/master/veggieseasons/lib/main.dart < / p >
import 'package:flutter/services.dart' show DeviceOrientation, SystemChrome;


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

只需在主程序中添加以下代码行。飞镖文件。

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

并且记得导入服务。飞镖文件。下面给出了一个例子!

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部分,您必须编辑信息。Plist文件从android工作室。你可以在数组列表中看到"~ ipad"。在info中有两个部分可用。Plist,你必须为iPhone和ipad手动编辑它。

这个解决方案已经在我的两个不同的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的最佳选择。

< p > ! !免责声明! ! 我做了一点研究,显然,文档在这里明确地说:

setPreferredOrientations method Limitations:


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

在这里是如何禁用多任务处理(即打开"要求全屏"option)

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

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

对于人们来说,他们现在正在阅读这个问题。 我发现的最简单的方法,它在android &ios设备。< / p >
 void main() {
WidgetsFlutterBinding.ensureInitialized();
SystemChrome.setPreferredOrientations(
[
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown,
],
).then((val) {
runApp(YourAppName());
});
}

在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

要使SystemChrome.setPreferredOrientations在iPad上工作,启用“需要全屏”;在Xcode项目编辑器或简单地添加以下行/ios/Runner/Info。Plist在你的项目文件夹。

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

这是一个简单的方法->

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

android有两个选项

<强> 1。写入main

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

< em > 2. 在AndroidManifest.xml文件上本地设置 enter image description here < / p >

iOS上也有两种选择

<强> 1。从info.plist < / >强

将这一行添加到你的info.plist文件中

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

< em > 2. 从跑步者 在Xcode中打开Runner.xcworkspace from iOS文件夹。点击Runner而不是Pods。你可以在通用部署信息中找到这个选项。看看你想要什么 enter image description here < / p >

颤振方向锁定:仅限纵向

在Flutter中,我们有SystemChrome.setPreferredOrientation() (看文档)来定义首选方向。您可以在所有关于Flutter中设置方向的文章中找到这种方法。让我们看看如何使用它:

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


void main() {
// We need to call it manually,
// because we going to call setPreferredOrientations()
// before the runApp() call
WidgetsFlutterBinding.ensureInitialized();
  

// Than we setup preferred orientations,
// and only after it finished we run our app
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp])
.then((value) => runApp(MyApp()));
}

iOS

在Xcode (ios/Runner.xcworkspace)中打开项目,在项目导航器中选择Runner,选择目标Runner,在Deployment Info部分的选项卡General上,我们可以设置设备方向:

enter image description here

同样,我们也可以在不打开Xcode的情况下手动完成——只需要编辑ios/Runner/Info.plist。将其作为文本文件打开,找到键UISupportedInterfaceOrientation并只留下所需的值:

<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
</array>

安卓

为了定义Android的方向,我们需要编辑ApplicationManifest。打开android/app/src/main/AndroidManifest.xml并为main活动添加属性screenOrientation:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.orientation_lock_example">
<application ...>
<activity
android:name=".MainActivity"
android:screenOrientation="portrait"
...
/>
...
</activity>
...
</application>
</manifest>

就这些。在这里是一个示例应用程序的存储库:

希望这对你有帮助。

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

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

这也可以通过XCode实现。

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

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

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