Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

FlutterでTextFieldに非同期で取得した結果を初期値に入れたい

色々探してやっとわかった..

flutter.institute

initStateに直接awaitって書くことは出来ない。そりゃそうだな。ビルドが終わってから状態を変え、再ビルドするという方法を探していた。

class MyWidget extends StatefulWidget {
    @override
    State createState() => new MyWidgetState();
}

class MyWidgetState extends State<MyWidget> {
    var _result;

    @override
    void initState() {
        loadAsyncData().then((result) {
            setState(() {
                _result = result;
            });
        });
    }
    
    @override
    Widget build(BuildContext context) {
        if (_result == null) {
            return new Container();
        }    
       return new TextField(initialValue :result);
    }
}

要約するとこうなる。

  • initStateの中にsetStateを用意して、非同期の結果をメンバ変数にいれる
  • setStateもいつ呼ばれるかわからんが、呼ばれるとbuildがもっかい走るので、resultの状態に応じてビルドするWidgetを変える。

うーん、今回はStateFulWidgetにしたけど、ProviderとStatelessWidgetでも同じことができる気がする... あとでやってみよう。