[Flutter]FutureBuilderは正確には非同期処理を待ってからWidgetを生成するわけではない

このページには広告が含まれる場合があります。

 

Flutterには非同期処理の結果を待ってからWidgetを生成してくれる「FutureBuilder」というWidgetがありますが、

これは正確には、非同期処理の結果を「待って」からWidgetを生成するわけではありません。

というのも、Widgetがbuildメソッドのタイミングで描画されないということはFlutterのフレームワーク上許容していないからです(buildメソッド発動のタイミングでは必ずWidgetは描画される)。

なぜなら、非同期処理の結果が出るまで描画しないと、アプリを使っているユーザーからすると画面が固まってしまう状態が続くことになり、応答なしエラー(Application Not Responding:ANR)が発生してしまう可能性があるからです。

Android アプリの UI スレッドが長時間ブロックされると、アプリケーション応答なし(ANR)エラーが発生します。アプリがフォアグラウンドにある場合、図 1 に示すように、ユーザーにダイアログが表示されます。ANR ダイアログにより、ユーザーはアプリを強制終了できます。UI の更新を担当するアプリのメインスレッドがユーザー入力イベントを処理または描画できず、ユーザーに不満が生じるため、ANR は問題です。

https://developer.android.com/topic/performance/vitals/anr

ということで、FutureBuilderというのは、正確には

  • 非同期処理の完了を待って「最初の」描画をするのではなくて、
  • 非同期処理の完了を待って「再」描画してくれるWidget

ということになります。

たとえば、以下のコード例の場合は、

  • 非同期処理の結果が出るまでの間はLoginScreenが
  • 非同期処理の結果が出たら(かつ正常な結果の場合は)HomeScreenが

描画されることになります。

return MaterialApp(
  home: FutureBuilder(
    future: loginViewModel.isSingIn(),
    builder: (context, AsyncSnapshot<bool> snapshot){
      print("FutureBuilder#builder: ${snapshot.data}");
      if (snapshot.hasData && snapshot.data == true){
        return HomeScreen();
      } else {
        return LoginScreen();
      }
    },
  ),
);

(詳しくは、以下の動画で解説していますので、よろしければご覧ください)

こんな記事も読まれています

人気No.1

前向きな気持ちになれる 占星術・タロットリーディング

あすコロ式・相談サロン 【ナビるやん】

人に言えない悩みから使命・運勢診断まで、あなたに寄り添いながら“ナビゲート”する、あすコロ人気No.1のオンライン相談サロン。占星術・心理学・タロットの叡智を活かし、普段認識していない「潜在意識」にアクセスしてあなたの気づいていない可能性を拓かせ、明日から前向きに歩めるようになる60分のリーディングセッション。

今すぐ詳細を見る(メルマガ登録で初回半額) ▶

TOP