Как справиться с ошибкой тайм-аута с 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');

Источник:

https://pub.dev/packages/dio

Вот что я предполагаю, глядя на один из их тестовых файлов и их класс ошибки:

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

Другие вопросы по тегам