Flutter: как предотвратить изменение ориентации устройства и заставить портрет?
Я хотел бы запретить моему приложению изменять ориентацию и заставить макет придерживаться "портрета".
В main.dart я поставил:
void main(){
SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown
]);
runApp(new MyApp());
}
но когда я использую кнопки поворота Android Simulator, макет "следует" новой ориентации устройства...
Как я могу это решить?
Спасибо
Ответы
Ответ 1
package:flutter/services.dart
импорта 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(...);
}
}
Ответ 2
@boeledi. Если вы хотите "заблокировать" ориентацию устройства и не разрешать его изменять, когда пользователь поворачивает свой телефон, это легко установить, как показано ниже,
// This did not work as requirement
void main() {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
runApp(new MyApp());
}
Вам нужно подождать, пока setPreferredOrientations
будет выполнено setPreferredOrientations
а затем запустите приложение.
// This will works always for lock screen Orientation.
void main() {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp])
.then((_) {
runApp(new MyApp());
});
}
Ответ 3
Для iOS вызов SystemChrome.setPreferredOrientations()
не работает для меня, и мне пришлось изменить это в проекте Xcode.
Ответ 4
Метод setPreferredOrientations возвращает объект Future. Согласно документации, Future представляет некоторую ценность, которая будет доступна где-то в будущем. Вот почему вы должны подождать, пока оно станет доступным, а затем перейти к заявке. Следовательно, должен использоваться метод then, который, по определению, "регистрирует обратные вызовы, которые будут вызваны после завершения Future". Следовательно, вы должны использовать этот код:
void main() {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]).then((_) {
runApp(new App());
});
}
Также должен быть импортирован следующий файл:
'Пакет: трепетание /services.dart'
Ответ 5
Прежде всего импортируйте это в файл 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());
});
}
Ответ 6
Откройте android/app/src/main/AndroidManifest.xml и обновите это
<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
Ответ 7
setPreferredOrientation
возвращает Future<void>
, поэтому он асинхронный. Наиболее читаемый подход - определить main
как асинхронный:
Future<void> main() async {
await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
return runApp(new MyApp());
}