Как справиться с ошибкой тайм-аута с Dio во Flutter?
Я использую Dio для обработки функций API.
Вот мой код:
Future<List<ItemModel>> getItems() async {
try {
Response response = await dio.get("$_apiUrl$_itemEndPoint",
options: Options(headers: {
"Accept": 'application/json',
}));
List<ItemModel> _items = List<ItemModel>();
response.data['data']?.forEach((c) {
_items.add(ItemModel.fromMap(c));
});
return _items;
} catch (e) {
throw (e);
}
}
Как я могу поймать ошибку из-за тайм-аута отправки и получения?
5 ответов
Управление исключением тайм-аута с помощью dio:
ApiRepositary.dart
class ApiRepositary {
Dio dio;
ApiRepositary() {
if (dio == null) {
BaseOptions options = new BaseOptions(
baseUrl: "your base url",
receiveDataWhenStatusError: true,
connectTimeout: 60*1000, // 60 seconds
receiveTimeout: 60*1000 // 60 seconds
);
dio = new Dio(options);
}
}
Future<LoginResponse> getLoginDetails(var loginRequestData) async {
try {
Response response = await dio.post("/authenticate", data: loginRequestData);
final LoginResponse loginResponse = LoginResponse.fromJson(response.data);
return loginResponse;
}on DioError catch (ex) {
if(ex.type == DioErrorType.CONNECT_TIMEOUT){
throw Exception("Connection Timeout Exception");
}
throw Exception(ex.message);
}
}
}
Пример исключения дескриптора:
void checkLogin(){
LoginRequest loginRequest = new LoginRequest(
email: "abcd@gmail.com",password: "passs@123");
var requestBody =jsonEncode(loginRequest);
debugPrint("Request Data : $requestBody");
_apiRepositary.getLoginDetails(requestBody).then((response){
debugPrint("Login Success $response");
//manage your response here
},
onError: (exception){
//Handle exception message
if(exception.message != null ){
debugPrint(exception.message); // Here you get : "Connection Timeout Exception"
}
},
);
}
Сначала вы должны определить опцию DIO:
BaseOptions options = new BaseOptions(
baseUrl: "http://example.org",
connectTimeout: 5000,
receiveTimeout: 3000,
);
тогда:
Dio dio = new Dio(options);
var jsonNews = await dio.get(
'http://example.org/v2/everything?q=bitcoin&from=2020-01-24&sortBy=publishedAt&apiKey=7f3c604b6e2245c88se50lzx02dc9cac1e2');
Источник:
Вот что я предполагаю, глядя на один из их тестовых файлов и их класс ошибки:
try {
await Dio().get("https://does.not.exist");
} on DioError catch (e) {
if (e.type == DioErrorType.CONNECT_TIMEOUT) {
// ...
}
if (e.type == DioErrorType.RECEIVE_TIMEOUT) {
// ...
}
}
Вы можете использовать try-catch для исключения тайм-аута и обрабатывать его на своей основе
Использовать Future.delayed
Future<List<ItemModel>> getItems() async {
Future.delayed(Duration(milliseconds: 500), () {
Response response = await dio.get("$_apiUrl$_itemEndPoint",
options: Options(headers: {
"Accept": 'application/json',
}));
List<ItemModel> _items = List<ItemModel>();
response.data['data']?.forEach((c) {
_items.add(ItemModel.fromMap(c));
});
return _items;
}
});
}
Для получения дополнительной информации Future.delayed