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のエラーハンドリングと似てますね。
投げ銭はいりません。それより無料でできる拡散をしてください!! 感想をツイートしていただけることが一番嬉しいです!!