FutureBuilderはずっと動作しています!


私の心の中で統計庁のオフィスビルを開発したとき、一番怒った瞬間が一番でした.
「Future Billderが思うままに行動するとき」

キーボードがイジェクトされるたびにFutureBuilderが再起動し、画面がリフレッシュされます.FutureBuilderTextFieldが同じ画面にある場合、初心者が直面しやすい問題です.理由は簡単だ.キーボードが上がると、画面が一新され、FutureBuilderが非同期操作を開始します.そうです.
スマートフォンのキーボードとパソコンのそれは違います.ハードウェアに存在しない.アプリケーションからキーボードをポップアップすると、画面に新しい要素が表示され、buildメソッドが呼び出されます.
すなわち,問題を解決するためにFutureBuilderの非同期動作は1回のみ実行でき,その後buildメソッドが呼び出されても再実行できない.
The future must be obtained earlier, because if the future is created at the same time as the FutureBuilder, then every time the FutureBuilder's parent is rebuilt, the asynchronous task will be restarted.FutureBuilderの正式な文書の内容の一部を抜粋した.buildメソッドを呼び出すと、FutureBuilderの将来の非同期操作も再実行されますので、これを回避するために、「早期」に将来を設定してください.
ここで、「早」はinitStateの方法に直接置くことを意味する.InitStateは、コンポーネントの作成時に初めて「1回のみ」操作を実行します.
  Future<dynamic> fetchList() async => await Dio().get("http://www.naver.com");
  Future? future;
  
  
  void initState() {
    future = fetchList();
    super.initState();
  }
initStateでは、Future型変数に非同期タスクを割り当て、FutureBuilderのfutureパラメータに戻します.
FutureBuilder(
    future: future,
    builder: (context, snapshot) {
    ...생략...
    }
)

キーボードがイジェクトされても、FutureBuilderは再び動作しません.