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
Brian Kung

なぜこれがあなたに起こるのかわからない。エミュレーターと自分のデバイスでコードを実行してみましたが、問題なく動作しました。
Hemanth Raj 2018

SystemChrome.setPreferredOrientationsは非同期で戻るため、runAppで囲む必要があるようthenです。
ケン

回答:


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月に更新されたフラッタードキュメントで言及されているように、このソリューションは一部のIOSデバイスでは機能しない可能性があります。

このようにInfo.plistのUISupportedInterfaceOrientationsを設定することで向きを修正するように助言します

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

詳細については、https://github.com/flutter/flutter/issues/27235#issuecomment-508995063


働いた。ありがとう<3
Suthura Sudharaka

1
SystemChrome.setPreferredOrientationsをメインに配置すると、エラーが発生します。バインディングが初期化される前に、ServicesBinding.defaultBinaryMessengerにアクセスしました。この時点でバインディングが初期化されているため、ビルドへのコードの挿入は機能します。
ゴールデンライオン

75

@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の提案がAndroidで機能することを示唆しているため、AndroidManifestのMainActivityに「android:screenOrientation = "portrait"」を追加します。
Tincho825

44

iOS:

呼び出しSystemChrome.setPreferredOrientations()は機能しません。Xcodeプロジェクトのを次のように変更する必要がありDevice Orientationました。

ここに画像の説明を入力してください

アンドロイド:

次のように、ファイルのメインアクティビティのscreenOrientation属性をに設定します。portraitandroid/app/src/main/AndroidManifest.xml

ここに画像の説明を入力してください


同じ問題がありましたが、iPadで実行しましたか?私はiPadでのみテストしましたが、これは問題のようです:github.com/flutter/flutter/issues/27235
Boy

アンドロイド:この属性はAPIレベル24で追加されました
BloodLoss

私はscreenOrientationAPIレベル8以降のAndroid を使用しています。@BloodLoss、あなたはドキュメントでそれを読んだと思いますが、resizeableActivity属性についてです。リンクをもう一度確認してください。^^
エリックM.スプレンゲル

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
盲目的にコピーアンドペーストしないように注意していただきありがとうございます
ライアン

1
貼り付けをコピーしないように要求した理由がわかります...末尾の}がありません...貼り付けをコピーします... :)
rohan koshti

フラッタークロームでは機能しませんでした
ゴールデンライオン

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確かに非常に読みにくくなります。
ロブリンドン

.thenを期待しているので、入れ子にする代わりに連鎖させることができますFutureOr。これにより、より読みやすくエレガントな、より機能的なアプローチを使用できます。たとえば、「then」をチェーンすることで、括弧で囲まれた本文の代わりに式の本文を使用できます。
マテウスフェリペ

コンパイル中にエラーが発生することがあります。ネイティブソリューションを使用してください。Abeer Iqbalの提案がAndroidで機能することを示唆しているため、AndroidManifestのMainActivityに「android:screenOrientation = "portrait"」を追加します。
Tincho825

エラーが発生した場合:「未処理の例外:バインディングが初期化される前にServicesBinding.defaultBinaryMessengerにアクセスしました。」この修正プログラムを使用してみてください:stackoverflow.com/questions/57689492/...
Fillipeシルバ

1

新しいフラッターバージョンでは、設定とともに、preferred Orientation1行追加する必要があります。

 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

インポートインポート 'package:flutter / services.dart';

次に、以下のコード行をmain.dartファイルに、そしてmainメソッドに次のように含めます。

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

runApp(myApp());

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.