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.

enter image description here

Ответ 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());
}