この章では、3Dモデルの読み込み状況を表す状態を定義します。

3Dモデルは、画面を開いた瞬間に表示されるとは限りません。インターネット上からファイルを取得し、解析して描画するまでに時間がかかります。また、通信環境やURLの問題によって読み込みに失敗する場合もあります。

そこで、現在の状況を一つの状態として管理し、後の章で状態に応じた表示へ切り替えられるようにします。

11.1 3Dモデル表示に必要な状態

今回のビューアーでは、次の3つの状態を扱います。

状態 意味
loading 3Dモデルを読み込んでいる
ready 読み込みが完了し、操作できる
error 読み込みに失敗した

アプリを起動した直後は、まだモデルが表示されていないためloadingです。正常に読み込まれればreadyへ変化し、失敗した場合はerrorへ変化します。

loading ──成功──▶ ready
   │
   └──失敗──▶ error

エラー後に再読み込みする場合は、errorから再びloadingへ戻します。

11.2 enumで状態を定義する

複数の決まった選択肢を表す場合は、Dartのenumを使用します。

model_viewer_screen.dartのimport文より下へ、次の定義を追加します。

enum ViewerStatus {
  loading,
  ready,
  error,
}

ViewerStatusは、3Dビューアーの状態を表す独自の型です。この型の値には、定義した3種類以外を代入できません。

1行で記述することもできます。

enum ViewerStatus { loading, ready, error }

教材では意味を確認しやすいように複数行で記述しても、完成コードに合わせて1行で記述しても構いません。

11.3 状態を保持する変数を追加する

_ModelViewerScreenStateの中へ、現在の状態を保持するフィールドを追加します。

class _ModelViewerScreenState extends State<ModelViewerScreen> {
  final Flutter3DController _controller = Flutter3DController();

  ViewerStatus _status = ViewerStatus.loading;
}