Flutter : 장치 방향 변경을 방지하고 세로로 강제하는 방법은 무엇입니까?


123

내 응용 프로그램의 방향이 변경되는 것을 방지하고 레이아웃을 "세로"로 고정하고 싶습니다.

main.dart에 다음을 넣습니다.

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

하지만 Android 시뮬레이터 회전 버튼을 사용하면 레이아웃이 새 기기 방향을 "따릅니다".

어떻게 해결할 수 있을까요?

감사


4
가져온 가정 'package:flutter/services.dart', 어쩌면 그것은 버그는 다음과 같습니다 github.com/flutter/flutter/issues/13238
브라이언 쿵

왜 이런 일이 발생하는지 잘 모르겠습니다. 에뮬레이터와 내 장치에서 코드를 실행 해 보았는데 제대로 작동합니다.
Hemanth 주권

SystemChrome.setPreferredOrientations반환 비동기과 같이 보인다 runApp안에 위치해야한다 then.
Ken

답변:


189

가져 오기 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 장치에서 작동하지 않을 수 있습니다.

Info.plist에서 UISupportedInterfaceOrientations를 다음과 같이 설정하여 방향을 수정하도록 조언합니다.

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

자세한 내용은 https://github.com/flutter/flutter/issues/27235#issuecomment-508995063


일했다. 감사합니다 <3
Suthura Sudharaka

1
SystemChrome.setPreferredOrientations를 main에 넣으면 바인딩이 초기화되기 전에 ServicesBinding.defaultBinaryMessenger에 액세스했습니다.라는 오류가 발생합니다. 이 시점에서 바인딩이 초기화되었으므로 빌드에 코드를 삽입하면 작동합니다.
Golden Lion

76

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

컴파일하는 동안 때때로 오류가 발생하므로 기본 솔루션을 사용해야합니다. Abeer Iqbal의 제안에 따라 AndroidManifest의 MainActivity에 'android : screenOrientation = "portrait"'를 추가하면 Android에서 저에게 효과적이었습니다.
Tincho825

44

iOS :

전화 SystemChrome.setPreferredOrientations()가 작동하지 않으며 Xcode 프로젝트 에서 다음과 같이 변경해야 Device Orientation했습니다 .

여기에 이미지 설명 입력

기계적 인조 인간:

다음과 같이 파일의 기본 활동에 대한 screenOrientation속성을 portrait로 설정하십시오 android/app/src/main/AndroidManifest.xml.

여기에 이미지 설명 입력


나도 같은 문제가 있었는데, iPad에서 실행 했습니까? 저는 iPad에서만 테스트 했는데 이것이
Boy

android :이 속성은 API 레벨 24에서 추가되었습니다.
BloodLoss

내가 사용하는 screenOrientation안드로이드 API 레벨 8부터. @BloodLoss, 문서에서 읽은 것 같지만 resizeableActivity속성 에 대해 . 링크를 다시 확인하십시오. ^^
Erick M. Sprengel

22

'setPreferredOrientations'메소드는 Future 객체를 반환합니다. 문서에 따라 Future는 향후 어딘가에서 사용할 수있는 가치를 나타냅니다. 그렇기 때문에 사용할 수있을 때까지 기다린 다음 응용 프로그램을 진행해야합니다. 따라서 정의에 따라 "Future가 완료 될 때 호출 할 콜백을 등록"하는 'then'메소드를 사용해야합니다. 따라서 다음 코드를 사용해야합니다.

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

또한 다음 파일을 가져와야합니다.

'package : flutter / services.dart'


나는 이것이 작동하는지 확인할 수 있습니다. 그러나 함수에 매개 변수가 없으면 then () 대신 whenComplete ()를 사용하십시오.
Csaba Gergely

20

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가 말했듯이)


감사합니다. configChanges "orientation"후에 "portrait"의 순서가 중요합니다.
MR_AMDEV

13

우선 이것을 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()),
      );

1
사람들에게 맹목적으로 복사하여 붙여 넣지 말라고 상기시켜 주셔서 감사합니다
Ryan

1
나는 당신이 붙여 넣기를 복사하지 말라고 요청한 이유를 봅니다 ... 결말}이 없습니다 ... 복사 붙여 넣기 ... :)
rohan koshti

플러터 크롬에서 작동하지 않음
Golden Lion

13

WidgetsFlutterBinding.ensureInitialized ()를 넣으면 빌드하는 동안 오류가 발생합니다.

import 'package:flutter/services.dart';

    void main() async => {
          WidgetsFlutterBinding.ensureInitialized(),

          await SystemChrome.setPreferredOrientations(
              [DeviceOrientation.portraitUp]), // To turn off landscape mode

          runApp(MainApp())
        };

5

setPreferredOrientation를 반환 Future<void>하므로 비동기입니다. 가장 읽기 쉬운 방법은 main비동기 로 정의하는 것입니다.

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

3
나는 매우 동의하지 않습니다. await여러 언어로 존재하는 유비쿼터스 프로그래밍 패턴이며 표현력이 무엇인지 매우 분명합니다. then중첩 수준을 만듭니다. 3 ~ 4 개의 연속이 있으면 then실제로 읽기가 매우 어려워지기 시작합니다.
Rob Lyndon

.then를 예상하므로 중첩 대신 연결할 수 있습니다 FutureOr. 이를 통해 더 읽기 쉽고 우아한 더 기능적인 접근 방식을 사용할 수 있습니다. 예를 들어 "thens"를 연결하여 대괄호 본문 대신 식 본문을 사용할 수 있습니다.
Mateus Felipe

컴파일하는 동안 때때로 오류가 발생하므로 기본 솔루션을 사용해야합니다. Abeer Iqbal의 제안에 따라 AndroidManifest의 MainActivity에 'android : screenOrientation = "portrait"'를 추가하면 Android에서 저에게 효과적이었습니다.
Tincho825

오류가 발생한 경우 : "처리되지 않은 예외 : 바인딩이 초기화되기 전에 ServicesBinding.defaultBinaryMessenger에 액세스했습니다." 이 수정 사항을 사용해보십시오 : stackoverflow.com/questions/57689492/…
Fillipe Silva

1

설정과 함께 새로운 flutter 버전에서 preferred Orientation우리는 한 줄을 추가해야합니다.

 WidgetsFlutterBinding.ensureInitialized();

그래서 이것에 대한 작업 코드는-

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


0

시험

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

Android 매니페스트 및 ios info.plist 파일에서 화면 방향 설정을 변경할 수도 있습니다.


0

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

그런 다음 main.dart 파일에 아래 코드 줄을 포함하고 다음과 같이 기본 메서드에 포함합니다.

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

runApp(myApp());

-4

가장 좋은 해결책은 MyApp ()의 빌드 메소드에서 사용하는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.