[Flutter]httpパッケージを使ったエラーハンドリング
Flutterアプリ開発において、HTTPリクエスト、レスポンスで発生するエラーを処理する方法についてご紹介します。
そもそもエラーハンドリングとは何でしょうか?定義はこちら。
このエラーハンドリングの手法はいくつかあり、自分がよく使うのはtry-catchを使う方法です。
try{}でエラーが発生したら処理を止めて、catch{}の処理を実行するようにします。以下コードではtryでエラーが出たら処理を止め、catchで_showPostDialogを呼び出してダイアログを表示し、アプリのユーザーにエラーが出ましたよ、ということを伝えることができます。
エラーが起きた時にユーザーに何らかのアクションを起こさないと、なぜエラーが起きたのか、エラーが起きたあとどうしたらいいのかを伝えられず、ストレスを与えてしまうことになるので、こういう処理は重要です。
void _showPostDialog(String title) {
showDialog(
context: context,
builder: (BuildContext context) {
return PostDialog(title: title);
},
);
}
try {
//何らかの処理を実施
} catch (e) {
//try内で発生したエラーをcatchする
print(e);
//発生したエラーの内容をprintしてterminalで確認
_showPostDialog("エラーが発生しました $e");
//エラーが発生したことをダイアログで画面に表示
}
}
Flutterアプリでhttp通信を行う際にも、httpパッケージを使えば簡単にエラーハンドリングができるんです。
まずはpubspec.yamlに以下を追加
dependencies:
http: ^0.13.5 //最新バージョン
エラーハンドリングを行うファイルに以下をインポート
import 'dart:convert';
import 'dart:async';
import 'package:http/http.dart' as http;
void main()でhttpのエラーハンドリングを行うfetchData()メソッドを実行します。以下コード解説。
void main() {
fetchData();
}
Future<void> fetchData() async {
final String url = 'https://api.example.com/data';
try {
final response = await http.get(Uri.parse(url));
if (response.statusCode == 200) {
var data = jsonDecode(response.body);
print('Data: $data');
} else {
throw Exception('Failed to load data');
}
} on http.ClientException catch (e) {
print('Network error: $e');
} catch (e) {
print('Unknown error: $e');
}
}
fetchData()
'https://api.example.com/data'というUrlをString型で格納。
その下からtry-catchを実行。
final response = await http.get(Uri.parse(url));
Uri型に変換したurlを使ってHTTP GETリクエストを投げ、返ってきたレスポンスをfinal responseに格納します。
if (response.statusCode == 200)
statusCodeが200のレスポンスが返ってきた、つまりGETリクエストが成功した場合、print('Data: $data');を実行。
on http.ClientException catch (e)
HTTPリクエスト/レスポンスでエラーが発生したら、on http.ClientException catch (e)で print('Network error: $e');が実行される
という流れになっています!