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