色々探してやっとわかった..
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でも同じことができる気がする... あとでやってみよう。