【Flutter】画面を縦向き・横向きに固定したまま表示させる方法！iPadで画面の向きを固定できない時の対処方法

こんにちは。
個人でアプリ開発をしているYuKiOです。

21年12月に12作目となるアプリとして「緊急警告メーカー」をリリースしました。

横画面に固定して使用するアプリだったのですが、iPadでは横向きに固定できない表示不具合が・・・。

別にiPad版はリリース予定はないので問題なしと考えていたのですが、AppStoreの審査に提出したところ、iPhone版だけであっても、iPadに互換インストール可能なため正常に動作する必要があるとのことで、無視できませんでした笑

今回は、Flutterで画面を縦向き・横向きに固定したままにする方法と、iPadのみ発生する画面の向きを固定できないという不具合の解消方法を紹介します。





<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">新作アプリをリリース🚗<a href="https://twitter.com/hashtag/%E7%85%BD%E3%82%8A%E9%81%8B%E8%BB%A2?src=hash&amp;ref_src=twsrc%5Etfw">#煽り運転</a> に遭遇！<br><br>車を止められ、激怒した相手が降りてきたら・・・怖いっ😭<br><br>こんな時、こんな 煽り運転 対策アプリがあったらいいのでは？と思って作ってみました！<br><br>煽り運転反対の人は、いいねとリツイート頂けると泣いて喜びます！<br><br>■iOS版<a href="https://t.co/KUsEefQwsb">https://t.co/KUsEefQwsb</a> <a href="https://t.co/C2asA7ozdp">pic.twitter.com/C2asA7ozdp</a></p>&mdash; YuKiO｜アプリ個人開発｜Flutter × Firebase | スケルカメラリリースしました (@oo_forward) <a href="https://twitter.com/oo_forward/status/1473849592168910849?ref_src=twsrc%5Etfw">December 23, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## Flutterで縦・横に画面を固定する方法
アプリの向きを固定する場合は、最初のMain関数を呼ぶタイミングで下記を追加します。runAppを呼ぶより前に実装する方法があります。
許可したい向きだけ「DeviceOrientation」を追加します。

```main.dart
import 'package:flutter/services.dart';
void main() async {
  WidgetsFlutterBinding.ensureInitialized(); //これ入れないとダメだったと思います。
  await SystemChrome.setPreferredOrientations([
//許可する向きを指定する。
   DeviceOrientation.portraitUp,//上向きを許可 
   DeviceOrientation.portraitDown,//下向きを許可
   DeviceOrientation.landscapeLeft,//左向きを許可
   DeviceOrientation.landscapeRight,//右向きを許可
  ]);
  runApp(const MyApp());
}
```

場合によっては、「スクリーンによって向きを変えたい！」なんてわがままな人もいると思います。

そんな時は該当スクリーンをStatefulWidgetにし、下記を追加して向きを指定します。


```you_are_selfish.dart

import 'package:flutter/services.dart';
class YouAreSelfish extends StatefulWidget {
  YouAreSelfish({Key? key}) : super(key: key);

  @override
  _YouAreSelfishState createState() => _YouAreSelfishState();
}

class _YouAreSelfishState extends State<YouAreSelfish> {

//このページだけの設定を追加。
  @override
  void didChangeDependencies() async {
    await SystemChrome.setPreferredOrientations([
      DeviceOrientation.landscapeLeft,
      DeviceOrientation.landscapeRight,
    ]);
    super.didChangeDependencies();
  }

//基本的に、pushで画面推移しているなら、
//画面が消えるので必要ありませんが、
//何かの理由で画面の向きを戻すなら、

@override
  void dispose() {
    SystemChrome.setPreferredOrientations([
      DeviceOrientation.portraitUp,
    ]);
    super.dispose();
  }
}

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}
```

## iPadだけ向きが固定できない問題
XcodeのRunner → TARGETS → Runner → Generalの場所で、Requires full　screenにチェックする。
これで、画面が固定されるようになります。
ただし、iPad特有の画面分割などには対応できなくなるようです。
今回は画面分割は必要ないので、こちらで問題ありませんでした。


![スクリーンショット 2021-12-28 17.14.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228439/ae076073-6a30-3523-6c9c-570ede4babab.png)



## 最後に
画面固定に関してですが、実装はとても簡単でしたが、iPadにトラップがあるので注意が必要です。
結局、iPad側でもしっかりと表示するように対応するなら・・・と思ってiPad版を出すことにしました。


いろんなアプリを作ったり、アプリ開発の活動についてつぶやいていますので、気になって頂けたら、こちらもご覧ください。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">HackerMemoを大幅にアップデートしたので、<br><br>海外向けのPVを作ってみました😆<br><br>夜なべして頑張って作ったので、拡散頂けたら泣いて喜びます😭🙏<br><br>音有りがオススメです！<br><br>元ネタわかる人いるかな〜🤔<br><br>アプリはこちら🔽<br>■iPhoneの方<a href="https://t.co/6T10L94Ld1">https://t.co/6T10L94Ld1</a><br><br>■Androidの方<a href="https://t.co/uBevCXrNw2">https://t.co/uBevCXrNw2</a> <a href="https://t.co/wiGLv46kaG">pic.twitter.com/wiGLv46kaG</a></p>&mdash; YuKiO｜アプリ個人開発｜Flutter × Firebase | スケルカメラリリースしました (@oo_forward) <a href="https://twitter.com/oo_forward/status/1348103082769453056?ref_src=twsrc%5Etfw">January 10, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>