ネットワーク通信中などでユーザーの操作を防ぎたい時には、全画面をやや暗くしてローディングアニメーションを表示する手法がよく使用される。
この様なUIを実現するためのパッケージはpub.devにも多く存在するが、折角なのでスクラッチで作成してみる。
完成アプリの動作
ソースコード
以下に重要そうな箇所を抜粋して説明する。詳細はリポジトリを参照。
Stackウィジェット
本アプリではStack
ウィジェットを使用して画面全体を覆うレイヤーをScaffold
ウィジェットの上に重ねている。
Stack
ウィジェットのchildren
プロパティは、下に記述するものほどアプリ上では上に表示されるので順番に注意。
if(_isLoading)記法
children
プロパティに渡すリストにて、if(...)
と記述すると、直後のウィジェットの表示非表示を制御できる。
本アプリでは_isLoading
というフラグを用いてロードアニメーションの表示非表示を制御しているので、条件式には_isLoading
を渡す。
Opacityウィジェット
子ウィジェットの透明度を調整できるウィジェット。今回は透明度を30%に設定した。
opacity
プロパティが1に近づくほど不透明になる。
ModalBarrierウィジェット
ModalBarrier
ウィジェットの下に表示されているウィジェットへのユーザー操作を妨げるウィジェット。
今回だとScaffold
ウィジェットが該当する。
CircularProgressIndicatorウィジェット
material designのローディングアニメーションを実装するためのウィジェット。 プロパティをいじることで挙動を制御できる。今回はデフォルトのまま。
_startOverlayLoadingAnimationメソッド
_isLoading
フラグを制御するためのメソッド。
ボタンをタップするとFuture.delayed()
で3秒間_isLoading
をtrue
にする。その後_isLoading
をfalse
に戻し、ロードアニメーションを非表示にしている。