1
0

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 1 year has passed since last update.

Flutterでawaitしない非同期処理内で投げられたエラーに対応する

Last updated at Posted at 2023-05-04

なんだこれは

以下のようなコードのエラー、キャッチできませんよね(多分)
非同期で処理を動かしつつ別の操作をユーザにはやらせるも、裏で動いてる非同期処理でエラーが起きた場合などにダイアログを出したい!みたいなときに詰まりました。
それに対応したときの方法をご紹介します
きれいな解決方法ではないです。その点はご了承下さい。いい方法あったら知りたい‥

class HogeWidget {
  Widget build(Context buildContext) {
    return ElevatedButton(
      child: Text('hoge');
      onPressed: () {
        try {
          fuga();
          Navigator.of(context).pushNamed('/aaaa');
        } on Exception catch(e) {
          // ここには辿り着けない
        }
      }
    );
  }
}

// 初期化っぽい処理とか。この中の処理はawaitしないのでasyncも付けない。
void fuga() {
  // 適当な処理がここに入る
  piyo();
  // 適当な処理がここに入る
}

Future<void> piyo() async {
  throw Exception('突然の死');
}

こうする

fuga関数にエラー時の処理を渡すことにしました。めんどくさいね。

class HogeWidget {
  Widget build(Context buildContext) {
    return ElevatedButton(
      child: Text('hoge');
      onPressed: () {
        fuga(
          onError: () {
            // ダイアログ出したりする
          },
        );
        Navigator.of(context).pushNamed('/aaaa');
      }
    );
  }
}

// 初期化っぽい処理とか。この中の処理はawaitしないのでasyncも付けない。
void fuga({void Function()? onError}) {
  // 適当な処理がここに入る
  piyo().catchError((_) => onError == null ? null : onError());
  // 適当な処理がここに入る
}

Future<void> piyo() async {
  throw Exception('突然の死');
}

さいごに

人類は未だに使いやすくて安全なエラー処理にたどり着いていないような気がする。

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?