15
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

FlutterのinitState()内で非同期処理の完了を待ちたい時の対応

Posted at

背景

初期化処理内で非同期処理の完了を待ちたかったため、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);
  }
15
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?