すらぼうの開発ノート

モバイルアプリエンジニアのメモ

【Flutter】「A RenderFlex overflowed by ... pixels on the bottom」エラー の対処方法

本エントリでは「A RenderFlex overflowed by ... pixels on the bottom」エラーの対処方法について説明する。



エラーについて

原因

画面に表示しているウィジェットが、表示するスペースが確保できなくなった為

よくあるケースとしてはTextFormFieldなどで入力フォームを用意し、フォームを選択してキーボードが表示された際に発生する。

発生例

本エラーが発生することが多いケースは、TextFormFieldなどのインプット系ウィジェットを使用した際に発生する。

例えば以下のようなフォームを作成したとする。

フォーム未選択状態

バツで締められた部分はPlaceholderウィジェット。 ここでフォームを選択すると以下のようなエラーが表示される。

フォーム選択状態

上記画像ではTextFormFieldの上下にPlaceholderを配置している。フォームを選択するとキーボードが表示されるが、Placeholderに被ってしまいエラーが表示されている


対処方法

対処方法は主に2種類ある。

  • resizeToAvoidBottomInset: false
  • SingleChildScrollViewでラップ

以下では「発生例」の章で示したUIをベースに、対処方法を説明する。

説明用コード(対処前)

resizeToAvoidBottomInset: false

ScaffoldウィジェットresizeToAvoidBottomInset: falseを追記する。 このresizeToAvoidBottomInsetをfalseにすることでFlutterがScaffoldウィジェットのサイズなどを自動で調整することを防ぐ。 設定した際の画面UIは以下。

resizeToAvoidBottomInset: falseに設定したUI

コードは以下。

SingleChildScrollViewでラップ

エラーが発生した画面で表示しているウィジェットをSingleChildScrollViewでラップする。 設定した際の画面UIは以下。

SingleChildScrollViewでラップしたUI

コードは以下。