Flutter Error Handler
- buat file data_state.dart untuk menghandel kondisi apabila data success, data failed, dan aplication error. T merupakan parameter generik yang mempunyai fleksibitas pada tipe data yang akan digunakan, T digunakan karena Model Response yang akan diterima bermacam-macam.
abstract class DataState<T> {
final T? data;
final Exception? error;
DataState({this.data, this.error});
}
class DataSuccess<T> extends DataState<T> {
DataSuccess(T data) : super(data: data);
}
class DataFailed<T> extends DataState<T> {
DataFailed(Exception error) : super(error: error);
}
class AplicationError<T> extends DataState<T> {
AplicationError(Exception error) : super(error: error);
}
Implementasikan Data State ini ke dalam file service yang akan digunakan seperti contoh dibawah ini.
Future<DataState<RenewTokenResponseModel>> renewAccessToken({
required String email,
required String token,
}) async {
try {
var url = Uri.parse(EndpointConst.authRenewTokenEndpoint);
var response = await http.post(
url,
body: {
ParameterConst.emailParameter: email,
ParameterConst.tokenParameter: token,
},
);
print("STATUS CODE : ${response.statusCode}");
var decodedResponse = jsonDecode(response.body);
RenewTokenResponseModel responseModel =
RenewTokenResponseModel.fromJson(decodedResponse);
if (response.statusCode == HttpStatus.ok) {
return DataSuccess(responseModel);
} else {
return DataFailed(Exception(
'${EndpointConst.authRenewTokenEndpoint} : ${response.statusCode}\n${responseModel.message}'));
}
} catch (e) {
return AplicationError(
Exception('${EndpointConst.authRenewTokenEndpoint}\n$e'));
}
}
pada contoh code diatas kita menggunakan data state untuk menghandel kondisi apabila response status code nya 200 maka akan dihandel dengan DataSuccess. Apabila status codenya selain 200 maka akan di handel dengan DataFailed karena termasuk kategori error saat mendapatkan data. Apabila errornya selain dari code maka akan dihandel dengan AplicationError.
kemudian untuk implementasi di file state management seperti contoh dibawah ini.
final responseState = await accessTokenUseCase.renewAccessToken(
email: loggedUser.email!,
token: tokenData.apiToken!,
);
print('RESPONSE STATE : $responseState');
if (responseState is DataSuccess) {
accessTokenUseCase.updateLocalAccessToken(
apiExpired: responseState.data!.data!.apiExpired!,
token: responseState.data!.data!.apiToken!,
);
CustomSnackBarMessage.showSnackBarMessage(
context, responseState.data!.message!, 3);
} else if (responseState is DataFailed) {
CustomSnackBarMessage.showSnackBarMessage(
context, responseState.error.toString(), 2);
} else {
CustomDialogMessage.showDialogMessage(
context,
[],
Text(responseState.error.toString()),
'Error/Bugs',
FontAwesomeIcons.triangleExclamation,
);
}
untuk di file state management codenya akan seperti ini untuk menghandel error dan data success.