Как обрабатывать запросы HTTP API при быстрой навигации по страницам | ФЛАТТЕР | ДАРТ

Для моего сценария я использовал http-пакет flutter для создания http-запросов... На главном экране мне нужно отправить около 3 http-запросов, так как мне пришлось использовать запросы ожидания, которые отправляются один за другим.

Я использовал класс BaseAPiService, поэтому все вызовы API будут проходить через него,

Если я перейду в другое место, когда происходит вышеуказанный запрос, как разрушить это соединение ?? В противном случае, если после навигации приложение также ожидает завершения предыдущих запросов API.

пример используемого базового класса службы API

      class ApiService {
  apiGet(url, data) async {
  Get.dialog(LoadingDialog());
  var response;
  if (data == null) {
    response = await http.get(
    baseUrl + url,
    headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json',
    },
  );
}
Navigator.pop(Get.overlayContext);
return response;
}

apiPost(url, data) async {
  FocusScopeNode currentFocus = FocusScope.of(Get.context);
  if (!currentFocus.hasPrimaryFocus) {
  currentFocus.unfocus();
  }
  Get.dialog(LoadingDialog());
  var response;
  if (data != null) {
   response = await http.post(baseUrl + url,
      headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json',
      },
      body: data);
}
if (data == null) {
  response = await http.post(
    baseUrl + url,
    headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json',
    },
  );
}
Navigator.pop(Get.overlayContext);
return response;
}
}

2 ответа

я нашел решение

Для этого необходимо закрыть http-соединение при навигации, для этого нужно сделать клиент из http и не нужно закрывать этот клиент при методе удаления.

      var client = http.Client()
var response = await client.get(url)

закрыть соединение при навигации

      void dispose(){
  super.dispose();
  client.close()
}

Если вы глубоко погрузились в свой код и у вас нет обработчика для http.Client. И вы не хотите, чтобы последний ответ отображался в пользовательском интерфейсе. тогда вы можете следовать этому подходу.

Мы не можем отменить будущее в Dart, но мы можем перестать слушать поток. И вот в чем загвоздка: мы можем преобразовать Future в поток и перестать его слушать, если вы хотите отменить Future.

      void main() {
    // keep a reference to your stream subscription
    StreamSubscription<List> dataSub;

    // convert the Future returned by getData() into a Stream
    dataSub = getData().asStream().listen((List data) {
    updateDisplay(data);
  });

  // user navigated away!
  dataSub.cancel();
}

взято для здесь

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