I am trying to create a login form, where i am trying to display a pop-up dialogue when server is not running, on invalid credentials and on when internet is not connected. here is my code.
var data={};
Future login() async {
Dio dio = new Dio();
try {
data = {
'username':user.username,
'password':user.password,
'date': formattedDate
};
await dio
.post(localhostUrlLogin, data: json.encode(data),)
.then((onResponse) async {
Navigator.push(
context, new MaterialPageRoute(builder: (context) => Navigation()));
});
} catch (e) {
print(OSError.noErrorCode);
if (OSError.noErrorCode== -1) {
showDialog(
context: context,
builder: (BuildContext context) {
return AdvanceCustomAlert(
title: "Connection Error",
descriptions: "Connection error",
icon: Icons.error,
bgcolor: Colors.red,
fgcolor: Colors.red,
);
});
} else {
print("con er");
showDialog(
context: context,
builder: (BuildContext context) {
return AdvanceCustomAlert(
title: "Try Again",
descriptions: "Invalid username or password!",
icon: Icons.error,
bgcolor: Colors.red,
fgcolor: Colors.red,
);
});
}
}
}
i am getting OSError.noErrorCode
-1 all on all condition, i am passing invalid input error on backend (api) but i can't access the onResponse after the try code.
kindly let me know how i can do this.
You can handle dio errors in a proper way as follows
try {
Response response = await allDataRepository.getData();
print(response.toString());
} on DioError catch (dioError) {
print(dioError);
if (dioError.type == DioErrorType.response) {
switch (dioError.response!.statusCode) {
case 404:
log(error: '400 - Not found');
break;
case 401:
log(error: '401 - Unauthorized.');
break;
case 500:
log(error: '500 - Internal Server Error.');
break;
case 501:
log(error: '501 - Not Implemented Server Error.');
break;
case 502:
log(error: '502 - Bad Gateway Server Error.');
break;
default:
log(error: '${dioError.response!.statusCode} - Something went wrong while trying to connect with the server');
break;
}
} else if (dioError.type == DioErrorType.other) {
log(error: 'Please check your internet connection. Try again switching to a different connection');
}
} catch (e) {
log(error: 'Something went wrong : $e');
}
Repository should look like this (data_repository.dart)
class DataRepository {
final HttpClient httpClient;
DataRepository({required this.httpClient});
Future<Response> getData() async {
Response response = await httpClient.dio.get(
GlobalConfig.getDataUrl,
);
return response;
}
}
HttpClient should look like this (http_client.dart)
class HttpClient {
final Dio dio;
HttpClient({required this.dio});
static final String basePath = GlobalConfig.baseUrl;
void addBasePathInterceptor() {
dio.interceptors.add(InterceptorsWrapper(
onRequest: (RequestOptions options, RequestInterceptorHandler handler) {
print(options.uri);
if (!options.path.startsWith("http")) {
options.baseUrl = basePath;
}
return handler.next(options);
},
));
addUrlInterceptor();
// addVersionInterceptor();
}
Interceptor? sessionCookieInterceptor;
Interceptor? versionCookieInterceptor;
Interceptor? status401Interceptor;
// void addSessionCookieInterceptor(List<String> cookies) {
// sessionCookieInterceptor = InterceptorsWrapper(
// onRequest: (RequestOptions options, RequestInterceptorHandler handler) {
// options.headers['cookie'] = cookies.join(';');
// });
// dio.interceptors.add(sessionCookieInterceptor!);
// }
// void addVersionInterceptor() {
// versionCookieInterceptor = InterceptorsWrapper(
// onRequest: (RequestOptions options, RequestInterceptorHandler handler) {
// options.headers['website-version'] = '26.3.0';
// });
// dio.interceptors.add(versionCookieInterceptor!);
// }
void addUrlInterceptor() {
dio.interceptors.add(InterceptorsWrapper(
onRequest: (RequestOptions options, RequestInterceptorHandler handler) {
print('onRequest ${options.uri}');
return handler.next(options);
},
onResponse: (Response response, ResponseInterceptorHandler handler) {
print('onResponse ${response.statusCode} ${response.realUri}');
return handler.next(response);
},
onError: (DioError error, ErrorInterceptorHandler handler) {
if (error.type == DioErrorType.response) {
print('------------------------');
print(error.error);
print(error.response?.realUri);
print(error.response?.statusCode);
print(error.response?.data);
print('------------------------');
}
return handler.next(error);
},
));
}
void add401Interceptor() {
print("Adding 401 interceptor");
status401Interceptor = InterceptorsWrapper(
onError: (DioError res, ErrorInterceptorHandler handler) {
if (res.response != null && res.response?.statusCode == 401) {
// globalBloc.add(ShowErrorSnackBar(
// error: 'You have been logged out, Please login again'));
// authenticationBloc.add(AuthenticationUnauthenticatedEvent());
// mainBloc.add(LougoutEvent());
}
return handler.next(res);
});
dio.interceptors.add(status401Interceptor!);
}
// void remove401Interceptor() {
// dio.interceptors.remove(status401Interceptor);
// }
}
Finally, Initialize HttpClient as below in main.dart
void main() async {
// Intializing Http Client
HttpClient(dio: sl()).addBasePathInterceptor();
runApp(MyApp());
}
Please note that you only need the following bunch of code. But I have described a good way to handle every API call in your app.
Dio dio = new Dio();
try {
Response response = await dio.get(GlobalConfig.getDataUrl);
print(response.toString());
} on DioError catch (dioError) {
print(dioError);
if (dioError.type == DioErrorType.response) {
switch (dioError.response!.statusCode) {
case 404:
log(error: '400 - Not found');
break;
case 401:
log(error: '401 - Unauthorized.');
break;
case 500:
log(error: '500 - Internal Server Error.');
break;
case 501:
log(error: '501 - Not Implemented Server Error.');
break;
case 502:
log(error: '502 - Bad Gateway Server Error.');
break;
default:
log(error: '${dioError.response!.statusCode} - Something went wrong while trying to connect with the server');
break;
}
} else if (dioError.type == DioErrorType.other) {
log(error: 'Please check your internet connection. Try again switching to a different connection');
}
} catch (e) {
log(error: 'Something went wrong : $e');
}