背景
初期化処理内で非同期処理の完了を待ちたかったため、void initState() async {...}
としたところ以下のようなエラーが発生した。どうやらinitState()
はasync
にできないらしい。
State.initState() must be a void method without an `async` keyword.
Rather than awaiting on asynchronous work directly inside of initState,
call a separate method to do this work without awaiting it.
環境
- Dart 2.4.0
- Flutter 1.7.8
対応
今回は、非同期処理が完了しないとウィジェットのbuildが失敗するというのが、初期化処理内で非同期処理完了を待ちたかった背景であった。
そのため、以下のどちらかを利用し、非同期処理の完了を待ってからウィジェットをbuildさせる。
- StreamBuilder
- 非同期処理の更新する変数が変化する度にウィジェットをbuildし直すBuilder
- FutureBuilder
- 指定した非同期処理の完了を待つBuilder
今回は、初期化処理以外でも変数を更新する必要があるため、StreamBuilderを利用する。
// StreamControllerの指定
StreamController<int> _controller = StreamController<int>.broadcast();
...
Widget build(BuildContext context) {
return Scaffold(
...
body: StreamBuilder(
stream: _controller.stream,
builder: (context, snapshot) {
if (snapshot.data == null) {
...
} else {
...
}
}
),
);
}
// 変数をウォッチしたい非同期処理
Future hoge() async {
value = ...
_controller.add(value);
}