위 식은 vue.js에서 자주 사용하던 식이다. 백앤드의 결과값을 받아와서 로직이 처리가 안 된다면 New Error로 Error 객체를 생성한 다음 throw를 하여 사용자에게 직접 메시지를 보여주던 방식으로 진행하였다.
하지만 flutter에서 try-catch는 이를 내부적으로 갖고있다. 즉, flutter와 dart가 client에 어떠한 이상이 있다면 스스로 Error를 생성하여 throw 한다는 것이다.
이때 여기서는 Error가 아닌 Exception 객체를 사용한다는 차이점이 존재한다.
하지만 위와같은 방법은 굉장히 위험하다 이를 잘 못 작성하면 app이 바로 충돌이 날 수 있기 때문이다.
그것은 위 사진을 보면 알 수 있다. 한 번 Exception이 throw가 되면 밑에 코드는 실행되지 않는다.
void _loadItems() async {
final url = Uri.https(
'react-http-e4fe2-default-rtdb.asia-southeast1.firebasedatabase.app',
'shopping-list.json',
);
try {
final response = await http.get(url);
// 값이 없을 때
if (response.body == 'null') {
setState(() {
_isLoading = false;
});
return;
}
if (response.statusCode >= 400) {
setState(() {
_error = "Failed to fetch data. Plz try again later.";
});
}
final Map<String, dynamic> listData = json.decode(response.body);
final List<GroceryItem> loadedItems = [];
for (final item in listData.entries) {
final tempCategory = categories.entries
.firstWhere((data) => data.value.title == item.value['category'])
.value;
loadedItems.add(GroceryItem(
id: item.key,
name: item.value['name'],
quantity: item.value['quantity'],
category: tempCategory));
}
setState(() {
_groceryItems = loadedItems;
_isLoading = false;
});
} catch (err) {
setState(() {
_error = err.toString();
});
}
}