テンプレOGP_2

Flutter(Dart)のエラーハンドリング3選

Flutter or Dartとしてエラーハンドリングは調べてみると、主に下記の3つがあって、その3つを紹介します。

1、.catchError((e) => ~~~) 
2、try - catchで囲む
3、builderの中で分岐する

1、.catchError((e) => ~~~) 

まず最初にベーシックなエラーハンドリングになります。

例えば下記のような非同期処理があって、これの成功のとき、失敗の時をハンドリングするとき、

Future<DocumentSnapshot> getUserInfo(String uid) {
  return Firestore.instance.collection("user").document(uid).get();
}

エラーハンドリングは下記のように行います。

getUserInfo(uid).then((value) {
    // 成功
}).catchError((err) {
    // 失敗
});

このパターンは主に非同期処理が一つしかなく、その結果をハンドリングしたい場合などに有効です。

2、try - catchで囲む

次にtry-catchで囲むパターンになります。

_setInitState() async {
    try {
      SharedPreferences preferences = await SharedPreferences.getInstance();
      String uid = await preferences.get("uid");
      User userInfo = await helper.getUserInfo(uid);
      SharedPreferences prefs = await SharedPreferences.getInstance();
      bool brightness = (prefs.getBool("isDark") ?? false);
      if (this.mounted) {
        setState(() {
          _uid = uid;
          _profileUrl = userInfo.iconUrl;
          _brightness = brightness;
        });
      }
    } catch (e) {
      // エラーハンドリング
    }

この場合は、複数のawaitがある状態でのエラーをハンドリングするときに有効です。

3、builderの中で分岐する

次に分岐でハンドリングする方法になります。主にFlutterの FutureBuilder や StreamBuilder のWidgetを使うときに有効です。

     return FutureBuilder(
        future: helper.getUsersGroupList(_uid),
        builder: (context, snapshot) {

          // エラーのとき
          if (snapshot.hasError) {
             // 失敗したとき
          }

          // 成功したとき
          final List<DocumentSnapshot> groupIdList = snapshot.data.documents;

          return ~~~~~ // なんか成功したときのWidget
        });

この例ではsnapshot.hasErrorで分岐してますが、REST API の場合はエラーコードとかで分岐したりすると思うので、適宜読み替えてください。

まとめ

1、.catchError((e) => ~~~) 
2、try - catchで囲む
3、builderの中で分岐する

自分のアプリではこの3つの方法で全てハンドリングしています。ぜひご活用ください。

DartはJavaScriptの仕様をめちゃくちゃ影響を受けているので、基本的にJavaScriptのエラーハンドリングと似てますね。

投げ銭はいりません。それより無料でできる拡散をしてください!! 感想をツイートしていただけることが一番嬉しいです!!